in core/flow/rule_manager.go [177:231]
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("[Flow onRuleUpdate] Ignoring invalid flow rule", "rule", rule, "reason", err.Error())
continue
}
validResRules = append(validResRules, rule)
}
if len(validResRules) > 0 {
validResRulesMap[res] = validResRules
}
}
start := util.CurrentTimeNano()
tcMux.RLock()
tcMapClone := make(TrafficControllerMap, len(validResRulesMap))
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, rulesOfRes := range validResRulesMap {
newTcsOfRes := buildResourceTrafficShapingController(res, rulesOfRes, tcMapClone[res])
if len(newTcsOfRes) > 0 {
m[res] = newTcsOfRes
}
}
tcMux.Lock()
tcMap = m
tcMux.Unlock()
currentRules = rawResRulesMap
logging.Debug("[Flow onRuleUpdate] Time statistic(ns) for updating flow rule", "timeCost", util.CurrentTimeNano()-start)
logRuleUpdate(validResRulesMap)
return nil
}