Skip to content

Commit

Permalink
Merge pull request #2 from a-robinson/success
Browse files Browse the repository at this point in the history
Reset non-closed circuitbreaker upon success
  • Loading branch information
a-robinson authored Oct 19, 2018
2 parents 7da8a8e + 79eae79 commit 4f5b168
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
2 changes: 1 addition & 1 deletion circuitbreaker.go
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ func (cb *Breaker) Success() {
cb.backoffLock.Unlock()

state := cb.state()
if state == halfopen {
if state != closed {
cb.Reset()
}
atomic.StoreInt64(&cb.consecFailures, 0)
Expand Down
44 changes: 44 additions & 0 deletions circuitbreaker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,50 @@ func TestRateBreakerResets(t *testing.T) {
}
}

func TestRateBreakerResetsOnSuccess(t *testing.T) {
serviceError := fmt.Errorf("service error")

called := 0
success := false
circuit := func() error {
if called < 4 {
called++
return serviceError
}
success = true
return nil
}

c := clock.NewMock()
cb := NewRateBreaker(0.5, 4)
cb.Clock = c
var err error
for i := 0; i < 4; i++ {
err = cb.Call(circuit, 0)
if err == nil {
t.Fatal("Expected cb to return an error (closed breaker, service failure)")
} else if err != serviceError {
t.Fatalf("Expected cb to return error from service; got %v", err)
}
}

err = cb.Call(circuit, 0)
if err == nil {
t.Fatal("Expected cb to return an error (open breaker)")
} else if err != ErrBreakerOpen {
t.Fatalf("Expected cb to return open open breaker error; got %v", err)
}

cb.Success()
err = cb.Call(circuit, 0)
if err != nil {
t.Fatalf("Expected cb to be successful after Success() call; got %v", err)
}
if !success {
t.Fatal("Expected cb to have been reset after Success() call")
}
}

func TestNeverRetryAfterBackoffStops(t *testing.T) {
cb := NewBreakerWithOptions(&Options{
BackOff: &backoff.StopBackOff{},
Expand Down

0 comments on commit 4f5b168

Please sign in to comment.