Skip to content

Commit 3c7f2bf

Browse files
committed
add ratelimiter flags
Signed-off-by: pigletfly <wangbing.adam@gmail.com>
1 parent d980eea commit 3c7f2bf

8 files changed

+58
-9
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
github.com/stretchr/testify v1.7.0
1717
github.com/vektra/mockery/v2 v2.9.4
1818
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b
19+
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac
1920
golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff
2021
gomodules.xyz/jsonpatch/v2 v2.2.0
2122
google.golang.org/grpc v1.40.0
@@ -143,7 +144,6 @@ require (
143144
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
144145
golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8 // indirect
145146
golang.org/x/text v0.3.7 // indirect
146-
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
147147
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
148148
google.golang.org/appengine v1.6.7 // indirect
149149
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 // indirect

pkg/controllers/binding/binding_controller.go

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"k8s.io/klog/v2"
1616
controllerruntime "sigs.k8s.io/controller-runtime"
1717
"sigs.k8s.io/controller-runtime/pkg/client"
18+
"sigs.k8s.io/controller-runtime/pkg/controller"
1819
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1920
"sigs.k8s.io/controller-runtime/pkg/handler"
2021
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -28,6 +29,7 @@ import (
2829
"github.com/karmada-io/karmada/pkg/util/helper"
2930
"github.com/karmada-io/karmada/pkg/util/informermanager"
3031
"github.com/karmada-io/karmada/pkg/util/overridemanager"
32+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
3133
)
3234

3335
// ControllerName is the controller name that will be used when reporting events.
@@ -169,6 +171,9 @@ func (c *ResourceBindingController) SetupWithManager(mgr controllerruntime.Manag
169171
Watches(&source.Kind{Type: &workv1alpha1.Work{}}, handler.EnqueueRequestsFromMapFunc(workFn), workPredicateFn).
170172
Watches(&source.Kind{Type: &policyv1alpha1.OverridePolicy{}}, handler.EnqueueRequestsFromMapFunc(c.newOverridePolicyFunc())).
171173
Watches(&source.Kind{Type: &policyv1alpha1.ClusterOverridePolicy{}}, handler.EnqueueRequestsFromMapFunc(c.newOverridePolicyFunc())).
174+
WithOptions(controller.Options{
175+
RateLimiter: ratelimiter.DefaultControllerRateLimiter(),
176+
}).
172177
Complete(c)
173178
}
174179

pkg/controllers/binding/cluster_resource_binding_controller.go

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"k8s.io/klog/v2"
1616
controllerruntime "sigs.k8s.io/controller-runtime"
1717
"sigs.k8s.io/controller-runtime/pkg/client"
18+
"sigs.k8s.io/controller-runtime/pkg/controller"
1819
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1920
"sigs.k8s.io/controller-runtime/pkg/handler"
2021
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -28,6 +29,7 @@ import (
2829
"github.com/karmada-io/karmada/pkg/util/helper"
2930
"github.com/karmada-io/karmada/pkg/util/informermanager"
3031
"github.com/karmada-io/karmada/pkg/util/overridemanager"
32+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
3133
)
3234

3335
// ClusterResourceBindingControllerName is the controller name that will be used when reporting events.
@@ -158,6 +160,9 @@ func (c *ClusterResourceBindingController) SetupWithManager(mgr controllerruntim
158160
Watches(&source.Kind{Type: &workv1alpha1.Work{}}, handler.EnqueueRequestsFromMapFunc(workFn), workPredicateFn).
159161
Watches(&source.Kind{Type: &policyv1alpha1.OverridePolicy{}}, handler.EnqueueRequestsFromMapFunc(c.newOverridePolicyFunc())).
160162
Watches(&source.Kind{Type: &policyv1alpha1.ClusterOverridePolicy{}}, handler.EnqueueRequestsFromMapFunc(c.newOverridePolicyFunc())).
163+
WithOptions(controller.Options{
164+
RateLimiter: ratelimiter.DefaultControllerRateLimiter(),
165+
}).
161166
Complete(c)
162167
}
163168

pkg/controllers/execution/execution_controller.go

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"k8s.io/klog/v2"
1616
controllerruntime "sigs.k8s.io/controller-runtime"
1717
"sigs.k8s.io/controller-runtime/pkg/client"
18+
"sigs.k8s.io/controller-runtime/pkg/controller"
1819
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1920
"sigs.k8s.io/controller-runtime/pkg/predicate"
2021

@@ -25,6 +26,7 @@ import (
2526
"github.com/karmada-io/karmada/pkg/util/informermanager/keys"
2627
"github.com/karmada-io/karmada/pkg/util/names"
2728
"github.com/karmada-io/karmada/pkg/util/objectwatcher"
29+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
2830
)
2931

3032
const (
@@ -100,6 +102,9 @@ func (c *Controller) SetupWithManager(mgr controllerruntime.Manager) error {
100102
For(&workv1alpha1.Work{}).
101103
WithEventFilter(predicate.GenerationChangedPredicate{}).
102104
WithEventFilter(c.PredicateFunc).
105+
WithOptions(controller.Options{
106+
RateLimiter: ratelimiter.DefaultControllerRateLimiter(),
107+
}).
103108
Complete(c)
104109
}
105110

pkg/controllers/status/cluster_status_controller.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import (
99
"sync"
1010
"time"
1111

12+
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
13+
"github.com/karmada-io/karmada/pkg/util"
14+
"github.com/karmada-io/karmada/pkg/util/helper"
15+
"github.com/karmada-io/karmada/pkg/util/informermanager"
16+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
1217
corev1 "k8s.io/api/core/v1"
1318
"k8s.io/apimachinery/pkg/api/equality"
1419
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -27,13 +32,9 @@ import (
2732
"k8s.io/utils/clock"
2833
controllerruntime "sigs.k8s.io/controller-runtime"
2934
"sigs.k8s.io/controller-runtime/pkg/client"
35+
"sigs.k8s.io/controller-runtime/pkg/controller"
3036
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3137
"sigs.k8s.io/controller-runtime/pkg/predicate"
32-
33-
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
34-
"github.com/karmada-io/karmada/pkg/util"
35-
"github.com/karmada-io/karmada/pkg/util/helper"
36-
"github.com/karmada-io/karmada/pkg/util/informermanager"
3738
)
3839

3940
const (
@@ -113,7 +114,9 @@ func (c *ClusterStatusController) Reconcile(ctx context.Context, req controllerr
113114

114115
// SetupWithManager creates a controller and register to controller manager.
115116
func (c *ClusterStatusController) SetupWithManager(mgr controllerruntime.Manager) error {
116-
return controllerruntime.NewControllerManagedBy(mgr).For(&clusterv1alpha1.Cluster{}).WithEventFilter(c.PredicateFunc).Complete(c)
117+
return controllerruntime.NewControllerManagedBy(mgr).For(&clusterv1alpha1.Cluster{}).WithEventFilter(c.PredicateFunc).WithOptions(controller.Options{
118+
RateLimiter: ratelimiter.DefaultControllerRateLimiter(),
119+
}).Complete(c)
117120
}
118121

119122
func (c *ClusterStatusController) syncClusterStatus(cluster *clusterv1alpha1.Cluster) (controllerruntime.Result, error) {

pkg/controllers/status/workstatus_controller.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"k8s.io/klog/v2"
1717
controllerruntime "sigs.k8s.io/controller-runtime"
1818
"sigs.k8s.io/controller-runtime/pkg/client"
19+
"sigs.k8s.io/controller-runtime/pkg/controller"
1920
"sigs.k8s.io/controller-runtime/pkg/predicate"
2021

2122
clusterv1alpha1 "github.com/karmada-io/karmada/pkg/apis/cluster/v1alpha1"
@@ -26,6 +27,7 @@ import (
2627
"github.com/karmada-io/karmada/pkg/util/informermanager/keys"
2728
"github.com/karmada-io/karmada/pkg/util/names"
2829
"github.com/karmada-io/karmada/pkg/util/objectwatcher"
30+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
2931
"github.com/karmada-io/karmada/pkg/util/restmapper"
3032
)
3133

@@ -443,5 +445,7 @@ func (c *WorkStatusController) getSingleClusterManager(cluster *clusterv1alpha1.
443445

444446
// SetupWithManager creates a controller and register to controller manager.
445447
func (c *WorkStatusController) SetupWithManager(mgr controllerruntime.Manager) error {
446-
return controllerruntime.NewControllerManagedBy(mgr).For(&workv1alpha1.Work{}).WithEventFilter(c.PredicateFunc).Complete(c)
448+
return controllerruntime.NewControllerManagedBy(mgr).For(&workv1alpha1.Work{}).WithEventFilter(c.PredicateFunc).WithOptions(controller.Options{
449+
RateLimiter: ratelimiter.DefaultControllerRateLimiter(),
450+
}).Complete(c)
447451
}

pkg/util/ratelimiter/rate_limiter.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package ratelimiter
2+
3+
import (
4+
"flag"
5+
"time"
6+
7+
"golang.org/x/time/rate"
8+
"k8s.io/client-go/util/workqueue"
9+
)
10+
11+
func init() {
12+
flag.DurationVar(&baseDelay, "rate-limiter-base-delay", time.Millisecond*5, "The base delay for rate limiter. Defaults 5ms")
13+
flag.DurationVar(&maxDelay, "rate-limiter-max-delay", time.Second*1000, "The max delay for rate limiter. Defaults 1000s")
14+
flag.IntVar(&qps, "rate-limiter-qps", 10, "The qps for rate limier. Defaults 10")
15+
flag.IntVar(&bucketSize, "rate-limiter-bucket-size", 100, "The bucket size for rate limier. Defaults 100")
16+
}
17+
18+
var baseDelay, maxDelay time.Duration
19+
var qps, bucketSize int
20+
21+
func DefaultControllerRateLimiter() workqueue.RateLimiter {
22+
return workqueue.NewMaxOfRateLimiter(
23+
workqueue.NewItemExponentialFailureRateLimiter(baseDelay, maxDelay),
24+
&workqueue.BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(qps), bucketSize)},
25+
)
26+
}

pkg/util/worker.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package util
22

33
import (
4+
"github.com/karmada-io/karmada/pkg/util/ratelimiter"
45
"k8s.io/apimachinery/pkg/runtime"
56
"k8s.io/apimachinery/pkg/util/wait"
67
"k8s.io/client-go/tools/cache"
@@ -60,7 +61,7 @@ func NewAsyncWorker(name string, keyFunc KeyFunc, reconcileFunc ReconcileFunc) A
6061
return &asyncWorker{
6162
keyFunc: keyFunc,
6263
reconcileFunc: reconcileFunc,
63-
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), name),
64+
queue: workqueue.NewNamedRateLimitingQueue(ratelimiter.DefaultControllerRateLimiter(), name),
6465
}
6566
}
6667

0 commit comments

Comments
 (0)