forked from failsafe-go/failsafe-go
/
bulkheadexecutor.go
31 lines (27 loc) · 1.01 KB
/
bulkheadexecutor.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
package bulkhead
import (
"github.com/failsafe-go/failsafe-go"
"github.com/failsafe-go/failsafe-go/common"
"github.com/failsafe-go/failsafe-go/internal"
"github.com/failsafe-go/failsafe-go/policy"
)
// bulkheadExecutor is a failsafe.Executor that handles failures according to a Bulkhead.
type bulkheadExecutor[R any] struct {
*policy.BaseExecutor[R]
*bulkhead[R]
}
var _ policy.Executor[any] = &bulkheadExecutor[any]{}
func (be *bulkheadExecutor[R]) Apply(innerFn func(failsafe.Execution[R]) *common.PolicyResult[R]) func(failsafe.Execution[R]) *common.PolicyResult[R] {
return func(exec failsafe.Execution[R]) *common.PolicyResult[R] {
execInternal := exec.(policy.ExecutionInternal[R])
if err := be.bulkhead.AcquirePermitWithMaxWait(execInternal.Context(), be.config.maxWaitTime); err != nil {
if be.config.onBulkheadFull != nil {
be.config.onBulkheadFull(failsafe.ExecutionEvent[R]{
ExecutionAttempt: execInternal.Copy(),
})
}
return internal.FailureResult[R](err)
}
return innerFn(exec)
}
}