diff --git a/clusterloader2/pkg/tuningset/global_qps_load.go b/clusterloader2/pkg/tuningset/global_qps_load.go index 7fccfb76ba..4443efce1e 100644 --- a/clusterloader2/pkg/tuningset/global_qps_load.go +++ b/clusterloader2/pkg/tuningset/global_qps_load.go @@ -18,6 +18,7 @@ package tuningset import ( "context" + "sync" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/perf-tests/clusterloader2/api" @@ -25,11 +26,31 @@ import ( "golang.org/x/time/rate" ) +type globalQPSLoadFactory struct { + existing map[string]*globalQPSLoad + lock sync.Mutex +} + +func newGlobalQPSLoadFactory() *globalQPSLoadFactory { + return &globalQPSLoadFactory{existing: make(map[string]*globalQPSLoad), lock: sync.Mutex{}} +} + +func (f *globalQPSLoadFactory) GetOrCreate(name string, params *api.GlobalQPSLoad) *globalQPSLoad { + f.lock.Lock() + defer f.lock.Unlock() + qps, ok := f.existing[name] + if !ok { + qps = newGlobalQPSLoad(params) + f.existing[name] = qps + } + return qps +} + type globalQPSLoad struct { limiter *rate.Limiter } -func newGlobalQPSLoad(params *api.GlobalQPSLoad) TuningSet { +func newGlobalQPSLoad(params *api.GlobalQPSLoad) *globalQPSLoad { return &globalQPSLoad{ limiter: rate.NewLimiter(rate.Limit(params.QPS), params.Burst), } diff --git a/clusterloader2/pkg/tuningset/simple_tuning_set_factory.go b/clusterloader2/pkg/tuningset/simple_tuning_set_factory.go index 3c46e50df6..a3c957f2c6 100644 --- a/clusterloader2/pkg/tuningset/simple_tuning_set_factory.go +++ b/clusterloader2/pkg/tuningset/simple_tuning_set_factory.go @@ -23,13 +23,15 @@ import ( ) type simpleTuningSetFactory struct { - tuningSetMap map[string]*api.TuningSet + tuningSetMap map[string]*api.TuningSet + globalQPSLoadFactory *globalQPSLoadFactory } // NewTuningSetFactory creates new ticker factory. func NewTuningSetFactory() TuningSetFactory { return &simpleTuningSetFactory{ - tuningSetMap: make(map[string]*api.TuningSet), + tuningSetMap: make(map[string]*api.TuningSet), + globalQPSLoadFactory: newGlobalQPSLoadFactory(), } } @@ -61,7 +63,7 @@ func (tf *simpleTuningSetFactory) CreateTuningSet(name string) (TuningSet, error case tuningSet.ParallelismLimitedLoad != nil: return newParallelismLimitedLoad(tuningSet.ParallelismLimitedLoad), nil case tuningSet.GlobalQPSLoad != nil: - return newGlobalQPSLoad(tuningSet.GlobalQPSLoad), nil + return tf.globalQPSLoadFactory.GetOrCreate(name, tuningSet.GlobalQPSLoad), nil default: return nil, fmt.Errorf("incorrect tuning set: %v", tuningSet) }