func onResourceRuleUpdate()

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
}