circuitbreaker icon indicating copy to clipboard operation
circuitbreaker copied to clipboard

Breaker.Ready() has side effects

Open youngkin opened this issue 8 years ago • 0 comments

Calling Ready() on a half-open breaker will reset the breaker to open. I'm writing a test to better understand how Breaker behaves in a half-open state. I'm using Breaker.Ready() to detect when the Breaker transitions to half-open.

...
// Breaker trips to open
...

ready := cb.Ready()
fmt.Print("\nLet circuit transition to half-open\n\n")
for {
    if ready {
        break
    }
    time.Sleep(10 * time.Millisecond)
    ready = cb.Ready()
}

fmt.Printf("\nReady() == %v; Tripped == %v\n", ready, cb.Tripped())
fmt.Printf("Call Ready() again after it returns true, Ready() == %v; Tripped() == %v\n\n", 
               cb.Ready(), cb.Tripped())

When run it prints

Ready() == true; Tripped == true
Call Ready() again after it returns true, Ready() == false; Tripped() == true

Since Call() also invokes Ready(), using Ready() as I did above causes the subsequent call to Call() to fail since the circuit state is now open.

So, is there a way to test a Breaker to see if it's half-open without calling Ready()? Also, given Ready()'s side effects, perhaps it shouldn't be public?

UPDATE: After re-reading the README file I have a better understanding of the intended use of Ready() to allow the user to implement their own version of Call(). Even so, it would be nice to call out in the godoc that Ready() should not be used in conjunction with Call().

youngkin avatar Apr 17 '16 16:04 youngkin