ax(mining): rename cb receiver to circuitBreaker in CircuitBreaker methods
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run

AX Principle 1: predictable names over short names. The receiver abbreviation
`cb` required mapping overhead — replaced with the full `circuitBreaker` name
across all eight methods in circuit_breaker.go.

Co-Authored-By: Charon <charon@lethean.io>
This commit is contained in:
Claude 2026-04-02 17:37:00 +01:00
parent 48a6532dea
commit 263b45db88
No known key found for this signature in database
GPG key ID: AF404715446AEB41

View file

@ -77,29 +77,29 @@ func NewCircuitBreaker(name string, config CircuitBreakerConfig) *CircuitBreaker
}
}
// if cb.State() == CircuitOpen { return nil, ErrCircuitOpen }
func (cb *CircuitBreaker) State() CircuitState {
cb.mutex.RLock()
defer cb.mutex.RUnlock()
return cb.state
// if circuitBreaker.State() == CircuitOpen { return nil, ErrCircuitOpen }
func (circuitBreaker *CircuitBreaker) State() CircuitState {
circuitBreaker.mutex.RLock()
defer circuitBreaker.mutex.RUnlock()
return circuitBreaker.state
}
// result, err := cb.Execute(func() (interface{}, error) { return fetchStats(ctx) })
func (cb *CircuitBreaker) Execute(fn func() (interface{}, error)) (interface{}, error) {
// result, err := circuitBreaker.Execute(func() (interface{}, error) { return fetchStats(ctx) })
func (circuitBreaker *CircuitBreaker) Execute(fn func() (interface{}, error)) (interface{}, error) {
// Check if we should allow this request
if !cb.allowRequest() {
if !circuitBreaker.allowRequest() {
// Return cached result if available
cb.mutex.RLock()
if cb.cachedResult != nil && time.Since(cb.lastCacheTime) < cb.cacheDuration {
result := cb.cachedResult
cb.mutex.RUnlock()
circuitBreaker.mutex.RLock()
if circuitBreaker.cachedResult != nil && time.Since(circuitBreaker.lastCacheTime) < circuitBreaker.cacheDuration {
result := circuitBreaker.cachedResult
circuitBreaker.mutex.RUnlock()
logging.Debug("circuit breaker returning cached result", logging.Fields{
"name": cb.name,
"state": cb.state.String(),
"name": circuitBreaker.name,
"state": circuitBreaker.state.String(),
})
return result, nil
}
cb.mutex.RUnlock()
circuitBreaker.mutex.RUnlock()
return nil, ErrCircuitOpen
}
@ -108,30 +108,30 @@ func (cb *CircuitBreaker) Execute(fn func() (interface{}, error)) (interface{},
// Record the result
if err != nil {
cb.recordFailure()
circuitBreaker.recordFailure()
} else {
cb.recordSuccess(result)
circuitBreaker.recordSuccess(result)
}
return result, err
}
// if cb.allowRequest() { /* execute the function */ }
func (cb *CircuitBreaker) allowRequest() bool {
cb.mutex.Lock()
defer cb.mutex.Unlock()
// if circuitBreaker.allowRequest() { /* execute the function */ }
func (circuitBreaker *CircuitBreaker) allowRequest() bool {
circuitBreaker.mutex.Lock()
defer circuitBreaker.mutex.Unlock()
switch cb.state {
switch circuitBreaker.state {
case CircuitClosed:
return true
case CircuitOpen:
// Check if we should transition to half-open
if time.Since(cb.lastFailure) > cb.config.ResetTimeout {
cb.state = CircuitHalfOpen
cb.successes = 0
if time.Since(circuitBreaker.lastFailure) > circuitBreaker.config.ResetTimeout {
circuitBreaker.state = CircuitHalfOpen
circuitBreaker.successes = 0
logging.Info("circuit breaker transitioning to half-open", logging.Fields{
"name": cb.name,
"name": circuitBreaker.name,
})
return true
}
@ -146,80 +146,80 @@ func (cb *CircuitBreaker) allowRequest() bool {
}
}
// cb.recordFailure() // increments failures; opens circuit after FailureThreshold is reached
func (cb *CircuitBreaker) recordFailure() {
cb.mutex.Lock()
defer cb.mutex.Unlock()
// circuitBreaker.recordFailure() // increments failures; opens circuit after FailureThreshold is reached
func (circuitBreaker *CircuitBreaker) recordFailure() {
circuitBreaker.mutex.Lock()
defer circuitBreaker.mutex.Unlock()
cb.failures++
cb.lastFailure = time.Now()
circuitBreaker.failures++
circuitBreaker.lastFailure = time.Now()
switch cb.state {
switch circuitBreaker.state {
case CircuitClosed:
if cb.failures >= cb.config.FailureThreshold {
cb.state = CircuitOpen
if circuitBreaker.failures >= circuitBreaker.config.FailureThreshold {
circuitBreaker.state = CircuitOpen
logging.Warn("circuit breaker opened", logging.Fields{
"name": cb.name,
"failures": cb.failures,
"name": circuitBreaker.name,
"failures": circuitBreaker.failures,
})
}
case CircuitHalfOpen:
// Probe failed, back to open
cb.state = CircuitOpen
circuitBreaker.state = CircuitOpen
logging.Warn("circuit breaker probe failed, reopening", logging.Fields{
"name": cb.name,
"name": circuitBreaker.name,
})
}
}
// cb.recordSuccess(stats) // caches result, resets failures; in HalfOpen closes the circuit after SuccessThreshold
func (cb *CircuitBreaker) recordSuccess(result interface{}) {
cb.mutex.Lock()
defer cb.mutex.Unlock()
// circuitBreaker.recordSuccess(stats) // caches result, resets failures; in HalfOpen closes the circuit after SuccessThreshold
func (circuitBreaker *CircuitBreaker) recordSuccess(result interface{}) {
circuitBreaker.mutex.Lock()
defer circuitBreaker.mutex.Unlock()
// Cache the successful result
cb.cachedResult = result
cb.lastCacheTime = time.Now()
cb.cachedErr = nil
circuitBreaker.cachedResult = result
circuitBreaker.lastCacheTime = time.Now()
circuitBreaker.cachedErr = nil
switch cb.state {
switch circuitBreaker.state {
case CircuitClosed:
// Reset failure count on success
cb.failures = 0
circuitBreaker.failures = 0
case CircuitHalfOpen:
cb.successes++
if cb.successes >= cb.config.SuccessThreshold {
cb.state = CircuitClosed
cb.failures = 0
circuitBreaker.successes++
if circuitBreaker.successes >= circuitBreaker.config.SuccessThreshold {
circuitBreaker.state = CircuitClosed
circuitBreaker.failures = 0
logging.Info("circuit breaker closed after successful probe", logging.Fields{
"name": cb.name,
"name": circuitBreaker.name,
})
}
}
}
// cb.Reset() // force closed state after maintenance window
func (cb *CircuitBreaker) Reset() {
cb.mutex.Lock()
defer cb.mutex.Unlock()
// circuitBreaker.Reset() // force closed state after maintenance window
func (circuitBreaker *CircuitBreaker) Reset() {
circuitBreaker.mutex.Lock()
defer circuitBreaker.mutex.Unlock()
cb.state = CircuitClosed
cb.failures = 0
cb.successes = 0
circuitBreaker.state = CircuitClosed
circuitBreaker.failures = 0
circuitBreaker.successes = 0
logging.Debug("circuit breaker manually reset", logging.Fields{
"name": cb.name,
"name": circuitBreaker.name,
})
}
// if result, ok := cb.GetCached(); ok { return result, nil }
func (cb *CircuitBreaker) GetCached() (interface{}, bool) {
cb.mutex.RLock()
defer cb.mutex.RUnlock()
// if result, ok := circuitBreaker.GetCached(); ok { return result, nil }
func (circuitBreaker *CircuitBreaker) GetCached() (interface{}, bool) {
circuitBreaker.mutex.RLock()
defer circuitBreaker.mutex.RUnlock()
if cb.cachedResult != nil && time.Since(cb.lastCacheTime) < cb.cacheDuration {
return cb.cachedResult, true
if circuitBreaker.cachedResult != nil && time.Since(circuitBreaker.lastCacheTime) < circuitBreaker.cacheDuration {
return circuitBreaker.cachedResult, true
}
return nil, false
}