in core/circuitbreaker/rule_manager.go [404:447]
func BuildResourceCircuitBreaker(res string, rulesOfRes []*Rule, oldResCbs []CircuitBreaker) []CircuitBreaker {
newCbsOfRes := make([]CircuitBreaker, 0, len(rulesOfRes))
for _, r := range rulesOfRes {
if res != r.Resource {
logging.Error(errors.Errorf("unmatched resource name expect: %s, actual: %s", res, r.Resource), "Unmatched resource name in circuitBreaker.BuildResourceCircuitBreaker()", "rule", r)
continue
}
equalIdx, reuseStatIdx := calculateReuseIndexFor(r, oldResCbs)
// First check equals scenario
if equalIdx >= 0 {
// reuse the old cb
equalOldCb := oldResCbs[equalIdx]
newCbsOfRes = append(newCbsOfRes, equalOldCb)
// remove old cb from oldResCbs
oldResCbs = append(oldResCbs[:equalIdx], oldResCbs[equalIdx+1:]...)
continue
}
generator := cbGenFuncMap[r.Strategy]
if generator == nil {
logging.Warn("[CircuitBreaker BuildResourceCircuitBreaker] Ignoring the rule due to unsupported circuit breaking strategy", "rule", r)
continue
}
var cb CircuitBreaker
var e error
if reuseStatIdx >= 0 {
cb, e = generator(r, oldResCbs[reuseStatIdx].BoundStat())
} else {
cb, e = generator(r, nil)
}
if cb == nil || e != nil {
logging.Warn("[CircuitBreaker BuildResourceCircuitBreaker] Ignoring the rule due to bad generated circuit breaker", "rule", r, "err", e.Error())
continue
}
if reuseStatIdx >= 0 {
oldResCbs = append(oldResCbs[:reuseStatIdx], oldResCbs[reuseStatIdx+1:]...)
}
newCbsOfRes = append(newCbsOfRes, cb)
}
return newCbsOfRes
}