Make deliveries refused while half-open wait a cooldown (closes #306)
check / check (push) Successful in 5m0s
check / check (push) Successful in 5m0s
While the breaker was half-open, Allow refused every delivery but the probe and CooldownRemaining returned zero, so each queued task for the target went straight back onto the retry channel and rewrote its status on every pass until the probe finished. CooldownRemaining now returns the whole cooldown while half-open, so a refused delivery waits that long. A refused delivery already at retrying is not written again, so the retry counter now moves only when a refusal moves a delivery into retrying. Model: opus-5-5
This commit was merged in pull request #330.
This commit is contained in:
@@ -76,12 +76,20 @@ func (cb *CircuitBreaker) Allow() bool {
|
||||
}
|
||||
}
|
||||
|
||||
// CooldownRemaining returns how much time is left before
|
||||
// an open circuit transitions to half-open.
|
||||
// CooldownRemaining returns how long a delivery that Allow refused
|
||||
// should wait before it is tried again. Closed, it returns zero.
|
||||
// Open, it returns what is left of the cooldown, or zero once that
|
||||
// has passed. Half-open, it returns the whole cooldown: the one
|
||||
// probe delivery is still in flight, and if it fails the circuit
|
||||
// reopens for that long.
|
||||
func (cb *CircuitBreaker) CooldownRemaining() time.Duration {
|
||||
cb.mu.Lock()
|
||||
defer cb.mu.Unlock()
|
||||
|
||||
if cb.state == CircuitHalfOpen {
|
||||
return cb.cooldown
|
||||
}
|
||||
|
||||
if cb.state != CircuitOpen {
|
||||
return 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user