in core/outlier/rule_manager.go [175:217]
func onResourceRuleUpdate(res string, rule *Rule) (err error) {
defer func() {
if r := recover(); r != nil {
var ok bool
err, ok = r.(error)
if !ok {
err = fmt.Errorf("%v", r)
}
}
}()
circuitRule := rule.Rule
if err = IsValidRule(rule); err != nil {
logging.Warn("[Outlier onResourceRuleUpdate] Ignoring invalid outlier ejection rule", "rule", rule, "err", err.Error())
return
}
if err = circuitbreaker.IsValidRule(circuitRule); err != nil {
logging.Warn("[Outlier onRuleUpdate] Ignoring invalid rule when loading new rules", "rule", rule, "err", err.Error())
return
}
start := util.CurrentTimeNano()
breakers := getNodeBreakersOfResource(res)
newBreakers := make(map[string]circuitbreaker.CircuitBreaker)
for address, breaker := range breakers {
newCbsOfRes := circuitbreaker.BuildResourceCircuitBreaker(res,
[]*circuitbreaker.Rule{circuitRule}, []circuitbreaker.CircuitBreaker{breaker})
if len(newCbsOfRes) > 0 {
newBreakers[address] = newCbsOfRes[0]
}
}
updateMux.Lock()
outlierRules[res] = rule
breakerRules[res] = circuitRule
nodeBreakers[res] = newBreakers
updateMux.Unlock()
currentRules[res] = rule
logging.Debug("[Outlier onResourceRuleUpdate] Time statistics(ns) for updating outlier ejection rule", "timeCost", util.CurrentTimeNano()-start)
logging.Info("[Outlier] load resource level rule", "resource", res, "rule", rule)
return nil
}