in core/flow/rule_manager.go [542:588]
func buildResourceTrafficShapingController(res string, rulesOfRes []*Rule, oldResTcs []*TrafficShapingController) []*TrafficShapingController {
newTcsOfRes := make([]*TrafficShapingController, 0, len(rulesOfRes))
for _, rule := range rulesOfRes {
if res != rule.Resource {
logging.Error(errors.Errorf("unmatched resource name expect: %s, actual: %s", res, rule.Resource), "Unmatched resource name in flow.buildResourceTrafficShapingController()", "rule", rule)
continue
}
equalIdx, reuseStatIdx := calculateReuseIndexFor(rule, oldResTcs)
// First check equals scenario
if equalIdx >= 0 {
// reuse the old tc
equalOldTc := oldResTcs[equalIdx]
newTcsOfRes = append(newTcsOfRes, equalOldTc)
// remove old tc from oldResTcs
oldResTcs = append(oldResTcs[:equalIdx], oldResTcs[equalIdx+1:]...)
continue
}
generator, supported := tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: rule.TokenCalculateStrategy,
controlBehavior: rule.ControlBehavior,
}]
if !supported || generator == nil {
logging.Error(errors.New("unsupported flow control strategy"), "Ignoring the rule due to unsupported control behavior in flow.buildResourceTrafficShapingController()", "rule", rule)
continue
}
var tc *TrafficShapingController
var e error
if reuseStatIdx >= 0 {
tc, e = generator(rule, &(oldResTcs[reuseStatIdx].boundStat))
} else {
tc, e = generator(rule, nil)
}
if tc == nil || e != nil {
logging.Error(errors.New("bad generated traffic controller"), "Ignoring the rule due to bad generated traffic controller in flow.buildResourceTrafficShapingController()", "rule", rule)
continue
}
if reuseStatIdx >= 0 {
// remove old tc from oldResTcs
oldResTcs = append(oldResTcs[:reuseStatIdx], oldResTcs[reuseStatIdx+1:]...)
}
newTcsOfRes = append(newTcsOfRes, tc)
}
return newTcsOfRes
}