forked from failsafe-go/failsafe-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
circuitbreakerexecutor.go
35 lines (29 loc) · 1.08 KB
/
circuitbreakerexecutor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package circuitbreaker
import (
"github.com/failsafe-go/failsafe-go/common"
"github.com/failsafe-go/failsafe-go/internal"
"github.com/failsafe-go/failsafe-go/policy"
)
// circuitBreakerExecutor is a failsafe.Executor that handles failures according to a CircuitBreaker.
type circuitBreakerExecutor[R any] struct {
*policy.BaseExecutor[R]
*circuitBreaker[R]
}
var _ policy.Executor[any] = &circuitBreakerExecutor[any]{}
func (cbe *circuitBreakerExecutor[R]) PreExecute(_ policy.ExecutionInternal[R]) *common.PolicyResult[R] {
if !cbe.circuitBreaker.TryAcquirePermit() {
return internal.FailureResult[R](ErrCircuitBreakerOpen)
}
return nil
}
func (cbe *circuitBreakerExecutor[R]) OnSuccess(exec policy.ExecutionInternal[R], result *common.PolicyResult[R]) {
cbe.BaseExecutor.OnSuccess(exec, result)
cbe.RecordSuccess()
}
func (cbe *circuitBreakerExecutor[R]) OnFailure(exec policy.ExecutionInternal[R], result *common.PolicyResult[R]) *common.PolicyResult[R] {
cbe.BaseExecutor.OnFailure(exec, result)
cbe.mtx.Lock()
defer cbe.mtx.Unlock()
cbe.recordFailure(exec)
return result
}