in core/circuitbreaker/rule_manager.go [283:325]
func onResourceRuleUpdate(res string, rawResRules []*Rule) (err error) {
defer func() {
if r := recover(); r != nil {
var ok bool
err, ok = r.(error)
if !ok {
err = fmt.Errorf("%v", r)
}
}
}()
validResRules := make([]*Rule, 0, len(rawResRules))
for _, rule := range rawResRules {
if err := IsValidRule(rule); err != nil {
logging.Warn("[CircuitBreaker onResourceRuleUpdate] Ignoring invalid circuitBreaker rule", "rule", rule, "reason", err.Error())
continue
}
validResRules = append(validResRules, rule)
}
start := util.CurrentTimeNano()
oldResCbs := make([]CircuitBreaker, 0)
updateMux.RLock()
oldResCbs = append(oldResCbs, breakers[res]...)
updateMux.RUnlock()
newCbsOfRes := BuildResourceCircuitBreaker(res, rawResRules, oldResCbs)
updateMux.Lock()
if len(newCbsOfRes) == 0 {
delete(breakerRules, res)
delete(breakers, res)
} else {
breakerRules[res] = validResRules
breakers[res] = newCbsOfRes
}
updateMux.Unlock()
currentRules[res] = rawResRules
logging.Debug("[CircuitBreaker onResourceRuleUpdate] Time statistics(ns) for updating circuit breaker rule", "timeCost", util.CurrentTimeNano()-start)
logging.Info("[CircuitBreaker] load resource level rules", "resource", res, "validResRules", validResRules)
return nil
}