in core/hotspot/rule_manager.go [156:208]
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("[HotSpot onRuleUpdate] Ignoring invalid hotspot param flow 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()
tcMux.RLock()
tcMapClone := make(trafficControllerMap, len(tcMap))
for res, tcs := range tcMap {
resTcClone := make([]TrafficShapingController, 0, len(tcs))
resTcClone = append(resTcClone, tcs...)
tcMapClone[res] = resTcClone
}
tcMux.RUnlock()
m := make(trafficControllerMap, len(validResRulesMap))
for res, rules := range validResRulesMap {
m[res] = buildResourceTrafficShapingController(res, rules, tcMapClone[res])
}
tcMux.Lock()
tcMap = m
tcMux.Unlock()
currentRules = rawResRulesMap
logging.Debug("[HotSpot onRuleUpdate] Time statistic(ns) for updating hotspot param flow rules", "timeCost", util.CurrentTimeNano()-start)
logRuleUpdate(validResRulesMap)
return nil
}