feat: optimize circuit breaker algorithm (#3897)
This commit is contained in:
@@ -60,8 +60,9 @@ func (b *googleBreaker) allow() (internalPromise, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (b *googleBreaker) doReq(req func() error, fallback func(err error) error, acceptable Acceptable) error {
|
||||
func (b *googleBreaker) doReq(req func() error, fallback Fallback, acceptable Acceptable) error {
|
||||
if err := b.accept(); err != nil {
|
||||
b.markFailure()
|
||||
if fallback != nil {
|
||||
return fallback(err)
|
||||
}
|
||||
@@ -69,18 +70,19 @@ func (b *googleBreaker) doReq(req func() error, fallback func(err error) error,
|
||||
return err
|
||||
}
|
||||
|
||||
var success bool
|
||||
defer func() {
|
||||
if e := recover(); e != nil {
|
||||
// if req() panic, success is false, mark as failure
|
||||
if success {
|
||||
b.markSuccess()
|
||||
} else {
|
||||
b.markFailure()
|
||||
panic(e)
|
||||
}
|
||||
}()
|
||||
|
||||
err := req()
|
||||
if acceptable(err) {
|
||||
b.markSuccess()
|
||||
} else {
|
||||
b.markFailure()
|
||||
success = true
|
||||
}
|
||||
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user