AsyncWorker adopt typed rate limiter

Signed-off-by: RainbowMango <qdurenhongcai@gmail.com>
This commit is contained in:
RainbowMango 2024-11-19 11:21:52 +08:00
parent 2c82055c4c
commit 02861c5ca0
7 changed files with 11 additions and 33 deletions

View File

@ -56,7 +56,7 @@ type MetricsController struct {
InformerManager genericmanager.MultiClusterInformerManager InformerManager genericmanager.MultiClusterInformerManager
TypedInformerManager typedmanager.MultiClusterInformerManager TypedInformerManager typedmanager.MultiClusterInformerManager
MultiClusterDiscovery multiclient.MultiClusterDiscoveryInterface MultiClusterDiscovery multiclient.MultiClusterDiscoveryInterface
queue workqueue.RateLimitingInterface queue workqueue.TypedRateLimitingInterface[any]
restConfig *rest.Config restConfig *rest.Config
} }
@ -70,7 +70,7 @@ func NewMetricsController(stopCh <-chan struct{}, restConfig *rest.Config, facto
InformerManager: genericmanager.GetInstance(), InformerManager: genericmanager.GetInstance(),
TypedInformerManager: newInstance(stopCh), TypedInformerManager: newInstance(stopCh),
restConfig: restConfig, restConfig: restConfig,
queue: workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{ queue: workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[any](), workqueue.TypedRateLimitingQueueConfig[any]{
Name: "metrics-adapter", Name: "metrics-adapter",
}), }),
} }

View File

@ -96,7 +96,7 @@ type Scheduler struct {
// ResourceBinding/ClusterResourceBinding rescheduling. // ResourceBinding/ClusterResourceBinding rescheduling.
clusterReconcileWorker util.AsyncWorker clusterReconcileWorker util.AsyncWorker
// TODO: implement a priority scheduling queue // TODO: implement a priority scheduling queue
queue workqueue.RateLimitingInterface queue workqueue.TypedRateLimitingInterface[any]
Algorithm core.ScheduleAlgorithm Algorithm core.ScheduleAlgorithm
schedulerCache schedulercache.Cache schedulerCache schedulercache.Cache
@ -239,7 +239,7 @@ func NewScheduler(dynamicClient dynamic.Interface, karmadaClient karmadaclientse
for _, opt := range opts { for _, opt := range opts {
opt(&options) opt(&options)
} }
queue := workqueue.NewRateLimitingQueueWithConfig(ratelimiterflag.LegacyControllerRateLimiter(options.RateLimiterOptions), workqueue.RateLimitingQueueConfig{Name: "scheduler-queue"}) queue := workqueue.NewTypedRateLimitingQueueWithConfig(ratelimiterflag.DefaultControllerRateLimiter[any](options.RateLimiterOptions), workqueue.TypedRateLimitingQueueConfig[any]{Name: "scheduler-queue"})
registry := frameworkplugins.NewInTreeRegistry() registry := frameworkplugins.NewInTreeRegistry()
if err := registry.Merge(options.outOfTreeRegistry); err != nil { if err := registry.Merge(options.outOfTreeRegistry); err != nil {
return nil, err return nil, err

View File

@ -1084,7 +1084,7 @@ func TestWorkerAndScheduleNext(t *testing.T) {
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) queue := workqueue.NewTypedRateLimitingQueue[any](workqueue.DefaultTypedControllerRateLimiter[any]())
bindingLister := &fakeBindingLister{binding: resourceBinding} bindingLister := &fakeBindingLister{binding: resourceBinding}
clusterBindingLister := &fakeClusterBindingLister{binding: clusterResourceBinding} clusterBindingLister := &fakeClusterBindingLister{binding: clusterResourceBinding}

View File

@ -68,7 +68,7 @@ type Controller struct {
restMapper meta.RESTMapper restMapper meta.RESTMapper
informerFactory informerfactory.SharedInformerFactory informerFactory informerfactory.SharedInformerFactory
clusterLister clusterlister.ClusterLister clusterLister clusterlister.ClusterLister
queue workqueue.RateLimitingInterface queue workqueue.TypedRateLimitingInterface[any]
clusterRegistry sync.Map clusterRegistry sync.Map
@ -78,7 +78,7 @@ type Controller struct {
// NewController returns a new ResourceRegistry controller // NewController returns a new ResourceRegistry controller
func NewController(restConfig *rest.Config, factory informerfactory.SharedInformerFactory, restMapper meta.RESTMapper) (*Controller, error) { func NewController(restConfig *rest.Config, factory informerfactory.SharedInformerFactory, restMapper meta.RESTMapper) (*Controller, error) {
clusterLister := factory.Cluster().V1alpha1().Clusters().Lister() clusterLister := factory.Cluster().V1alpha1().Clusters().Lister()
queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) queue := workqueue.NewTypedRateLimitingQueue[any](workqueue.DefaultTypedControllerRateLimiter[any]())
c := &Controller{ c := &Controller{
restConfig: restConfig, restConfig: restConfig,

View File

@ -83,7 +83,7 @@ type Detector struct {
nodeName string nodeName string
clusterName string clusterName string
queue workqueue.RateLimitingInterface queue workqueue.TypedRateLimitingInterface[any]
eventBroadcaster record.EventBroadcaster eventBroadcaster record.EventBroadcaster
eventRecorder record.EventRecorder eventRecorder record.EventRecorder
} }
@ -122,7 +122,7 @@ func NewCorednsDetector(memberClusterClient kubernetes.Interface, karmadaClient
cacheSynced: []cache.InformerSynced{nodeInformer.Informer().HasSynced}, cacheSynced: []cache.InformerSynced{nodeInformer.Informer().HasSynced},
eventBroadcaster: broadcaster, eventBroadcaster: broadcaster,
eventRecorder: recorder, eventRecorder: recorder,
queue: workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{Name: name}), queue: workqueue.NewTypedRateLimitingQueueWithConfig(workqueue.DefaultTypedControllerRateLimiter[any](), workqueue.TypedRateLimitingQueueConfig[any]{Name: name}),
lec: leaderelection.LeaderElectionConfig{ lec: leaderelection.LeaderElectionConfig{
Lock: rl, Lock: rl,
LeaseDuration: baselec.LeaseDuration.Duration, LeaseDuration: baselec.LeaseDuration.Duration,

View File

@ -68,25 +68,3 @@ func DefaultControllerRateLimiter[T comparable](opts Options) workqueue.TypedRat
&workqueue.TypedBucketRateLimiter[T]{Limiter: rate.NewLimiter(rate.Limit(opts.RateLimiterQPS), opts.RateLimiterBucketSize)}, &workqueue.TypedBucketRateLimiter[T]{Limiter: rate.NewLimiter(rate.Limit(opts.RateLimiterQPS), opts.RateLimiterBucketSize)},
) )
} }
// LegacyControllerRateLimiter provide a default rate limiter for controller, and users can tune it by corresponding flags.
// TODO(@RainbowMango): This function will only used by asyncWorker and will be removed after bump Kubernetes dependency to v1.31.
func LegacyControllerRateLimiter(opts Options) workqueue.RateLimiter {
// set defaults
if opts.RateLimiterBaseDelay <= 0 {
opts.RateLimiterBaseDelay = 5 * time.Millisecond
}
if opts.RateLimiterMaxDelay <= 0 {
opts.RateLimiterMaxDelay = 1000 * time.Second
}
if opts.RateLimiterQPS <= 0 {
opts.RateLimiterQPS = 10
}
if opts.RateLimiterBucketSize <= 0 {
opts.RateLimiterBucketSize = 100
}
return workqueue.NewMaxOfRateLimiter(
workqueue.NewItemExponentialFailureRateLimiter(opts.RateLimiterBaseDelay, opts.RateLimiterMaxDelay),
&workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(opts.RateLimiterQPS), opts.RateLimiterBucketSize)},
)
}

View File

@ -65,7 +65,7 @@ type asyncWorker struct {
// reconcileFunc is the function that process keys from the queue. // reconcileFunc is the function that process keys from the queue.
reconcileFunc ReconcileFunc reconcileFunc ReconcileFunc
// queue allowing parallel processing of resources. // queue allowing parallel processing of resources.
queue workqueue.RateLimitingInterface queue workqueue.TypedRateLimitingInterface[any]
} }
// Options are the arguments for creating a new AsyncWorker. // Options are the arguments for creating a new AsyncWorker.
@ -83,7 +83,7 @@ func NewAsyncWorker(opt Options) AsyncWorker {
return &asyncWorker{ return &asyncWorker{
keyFunc: opt.KeyFunc, keyFunc: opt.KeyFunc,
reconcileFunc: opt.ReconcileFunc, reconcileFunc: opt.ReconcileFunc,
queue: workqueue.NewRateLimitingQueueWithConfig(ratelimiterflag.LegacyControllerRateLimiter(opt.RateLimiterOptions), workqueue.RateLimitingQueueConfig{ queue: workqueue.NewTypedRateLimitingQueueWithConfig(ratelimiterflag.DefaultControllerRateLimiter[any](opt.RateLimiterOptions), workqueue.TypedRateLimitingQueueConfig[any]{
Name: opt.Name, Name: opt.Name,
}), }),
} }