diff --git a/circuit_breaker.go b/circuit_breaker.go index 8b25251b..b6b42122 100644 --- a/circuit_breaker.go +++ b/circuit_breaker.go @@ -31,7 +31,7 @@ type CircuitBreaker struct { state atomic.Value // circuitBreakerState failureCount atomic.Uint32 successCount atomic.Uint32 - lastFailureAt time.Time + lastFailureAt atomic.Value // time.Time } // NewCircuitBreaker method creates a new [CircuitBreaker] with default settings. @@ -117,10 +117,6 @@ func (cb *CircuitBreaker) getState() circuitBreakerState { } func (cb *CircuitBreaker) allow() error { - if cb == nil { - return nil - } - if cb.getState() == circuitBreakerStateOpen { return ErrCircuitBreakerOpen } @@ -129,10 +125,6 @@ func (cb *CircuitBreaker) allow() error { } func (cb *CircuitBreaker) applyPolicies(resp *http.Response) { - if cb == nil { - return - } - failed := false for _, policy := range cb.policies { if policy(resp) { @@ -142,7 +134,7 @@ func (cb *CircuitBreaker) applyPolicies(resp *http.Response) { } if failed { - if cb.failureCount.Load() > 0 && time.Since(cb.lastFailureAt) > cb.timeout { + if cb.failureCount.Load() > 0 && time.Since(cb.lastFailureAt.Load().(time.Time)) > cb.timeout { cb.failureCount.Store(0) } @@ -152,7 +144,7 @@ func (cb *CircuitBreaker) applyPolicies(resp *http.Response) { if failCount >= cb.failureThreshold { cb.open() } else { - cb.lastFailureAt = time.Now() + cb.lastFailureAt.Store(time.Now()) } case circuitBreakerStateHalfOpen: cb.open() diff --git a/client.go b/client.go index ec6141f8..656252ef 100644 --- a/client.go +++ b/client.go @@ -2240,8 +2240,10 @@ func (c *Client) executeRequestMiddlewares(req *Request) (err error) { // Executes method executes the given `Request` object and returns // response or error. func (c *Client) execute(req *Request) (*Response, error) { - if err := c.circuitBreaker.allow(); err != nil { - return nil, err + if c.circuitBreaker != nil { + if err := c.circuitBreaker.allow(); err != nil { + return nil, err + } } if err := c.executeRequestMiddlewares(req); err != nil { @@ -2268,7 +2270,9 @@ func (c *Client) execute(req *Request) (*Response, error) { } } if resp != nil { - c.circuitBreaker.applyPolicies(resp) + if c.circuitBreaker != nil { + c.circuitBreaker.applyPolicies(resp) + } response.Body = resp.Body if err = response.wrapContentDecompresser(); err != nil {