in core/flow/rule_manager.go [56:160]
func init() {
// Initialize the traffic shaping controller generator map for existing control behaviors.
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: Direct,
controlBehavior: Reject,
}] = func(rule *Rule, boundStat *standaloneStatistic) (*TrafficShapingController, error) {
if boundStat == nil {
var err error
boundStat, err = generateStatFor(rule)
if err != nil {
return nil, err
}
}
tsc, err := NewTrafficShapingController(rule, boundStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewDirectTrafficShapingCalculator(tsc, rule.Threshold)
tsc.flowChecker = NewRejectTrafficShapingChecker(tsc, rule)
return tsc, nil
}
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: Direct,
controlBehavior: Throttling,
}] = func(rule *Rule, _ *standaloneStatistic) (*TrafficShapingController, error) {
// Direct token calculate strategy and throttling control behavior don't use stat, so we just give a nop stat.
tsc, err := NewTrafficShapingController(rule, nopStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewDirectTrafficShapingCalculator(tsc, rule.Threshold)
tsc.flowChecker = NewThrottlingChecker(tsc, rule.MaxQueueingTimeMs, rule.StatIntervalInMs)
return tsc, nil
}
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: WarmUp,
controlBehavior: Reject,
}] = func(rule *Rule, boundStat *standaloneStatistic) (*TrafficShapingController, error) {
if boundStat == nil {
var err error
boundStat, err = generateStatFor(rule)
if err != nil {
return nil, err
}
}
tsc, err := NewTrafficShapingController(rule, boundStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewWarmUpTrafficShapingCalculator(tsc, rule)
tsc.flowChecker = NewRejectTrafficShapingChecker(tsc, rule)
return tsc, nil
}
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: WarmUp,
controlBehavior: Throttling,
}] = func(rule *Rule, boundStat *standaloneStatistic) (*TrafficShapingController, error) {
if boundStat == nil {
var err error
boundStat, err = generateStatFor(rule)
if err != nil {
return nil, err
}
}
tsc, err := NewTrafficShapingController(rule, boundStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewWarmUpTrafficShapingCalculator(tsc, rule)
tsc.flowChecker = NewThrottlingChecker(tsc, rule.MaxQueueingTimeMs, rule.StatIntervalInMs)
return tsc, nil
}
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: MemoryAdaptive,
controlBehavior: Reject,
}] = func(rule *Rule, boundStat *standaloneStatistic) (*TrafficShapingController, error) {
if boundStat == nil {
var err error
boundStat, err = generateStatFor(rule)
if err != nil {
return nil, err
}
}
tsc, err := NewTrafficShapingController(rule, boundStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewMemoryAdaptiveTrafficShapingCalculator(tsc, rule)
tsc.flowChecker = NewRejectTrafficShapingChecker(tsc, rule)
return tsc, nil
}
tcGenFuncMap[trafficControllerGenKey{
tokenCalculateStrategy: MemoryAdaptive,
controlBehavior: Throttling,
}] = func(rule *Rule, _ *standaloneStatistic) (*TrafficShapingController, error) {
// MemoryAdaptive token calculate strategy and throttling control behavior don't use stat, so we just give a nop stat.
tsc, err := NewTrafficShapingController(rule, nopStat)
if err != nil || tsc == nil {
return nil, err
}
tsc.flowCalculator = NewMemoryAdaptiveTrafficShapingCalculator(tsc, rule)
tsc.flowChecker = NewThrottlingChecker(tsc, rule.MaxQueueingTimeMs, rule.StatIntervalInMs)
return tsc, nil
}
}