in core/circuitbreaker/rule_manager.go [227:281]
func onRuleUpdate(rawResRulesMap map[string][]*Rule) (err error) {
defer func() {
if r := recover(); r != nil {
var ok bool
err, ok = r.(error)
if !ok {
err = fmt.Errorf("%+v", r)
}
}
}()
// ignore invalid rules
validResRulesMap := make(map[string][]*Rule, len(rawResRulesMap))
for res, rules := range rawResRulesMap {
validResRules := make([]*Rule, 0, len(rules))
for _, rule := range rules {
if err := IsValidRule(rule); err != nil {
logging.Warn("[CircuitBreaker onRuleUpdate] Ignoring invalid circuit breaking rule when loading new rules", "rule", rule, "err", err.Error())
continue
}
validResRules = append(validResRules, rule)
}
if len(validResRules) > 0 {
validResRulesMap[res] = validResRules
}
}
start := util.CurrentTimeNano()
updateMux.RLock()
breakersClone := make(map[string][]CircuitBreaker, len(validResRulesMap))
for res, tcs := range breakers {
resTcClone := make([]CircuitBreaker, 0, len(tcs))
resTcClone = append(resTcClone, tcs...)
breakersClone[res] = resTcClone
}
updateMux.RUnlock()
newBreakers := make(map[string][]CircuitBreaker, len(validResRulesMap))
for res, resRules := range validResRulesMap {
newCbsOfRes := BuildResourceCircuitBreaker(res, resRules, breakersClone[res])
if len(newCbsOfRes) > 0 {
newBreakers[res] = newCbsOfRes
}
}
updateMux.Lock()
breakerRules = validResRulesMap
breakers = newBreakers
updateMux.Unlock()
currentRules = rawResRulesMap
logging.Debug("[CircuitBreaker onRuleUpdate] Time statistics(ns) for updating circuit breaker rule", "timeCost", util.CurrentTimeNano()-start)
LogRuleUpdate(validResRulesMap)
return nil
}