From a6277bbabf237328e46cf0aa034aea480d4b44f5 Mon Sep 17 00:00:00 2001 From: luyou86 <205893776@qq.com> Date: Sun, 29 Aug 2021 17:45:58 +0800 Subject: [PATCH] client-go bucket rate limiter add maxDelay Kubernetes-commit: 57ec8336195702dd0d5f6f19fd3907e2a6a615a8 --- util/workqueue/default_rate_limiters.go | 27 ++++++++++++++++++++ util/workqueue/default_rate_limiters_test.go | 21 +++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/util/workqueue/default_rate_limiters.go b/util/workqueue/default_rate_limiters.go index 6609d7c2..efda7c19 100644 --- a/util/workqueue/default_rate_limiters.go +++ b/util/workqueue/default_rate_limiters.go @@ -209,3 +209,30 @@ func (r *MaxOfRateLimiter) Forget(item interface{}) { limiter.Forget(item) } } + +// WithMaxWaitRateLimiter have maxDelay which avoids waiting too long +type WithMaxWaitRateLimiter struct { + limiter RateLimiter + maxDelay time.Duration +} + +func NewWithMaxWaitRateLimiter(limiter RateLimiter, maxDelay time.Duration) RateLimiter { + return &WithMaxWaitRateLimiter{limiter: limiter, maxDelay: maxDelay} +} + +func (w WithMaxWaitRateLimiter) When(item interface{}) time.Duration { + delay := w.limiter.When(item) + if delay > w.maxDelay { + return w.maxDelay + } + + return delay +} + +func (w WithMaxWaitRateLimiter) Forget(item interface{}) { + w.limiter.Forget(item) +} + +func (w WithMaxWaitRateLimiter) NumRequeues(item interface{}) int { + return w.limiter.NumRequeues(item) +} diff --git a/util/workqueue/default_rate_limiters_test.go b/util/workqueue/default_rate_limiters_test.go index 91d34a31..5b1546f3 100644 --- a/util/workqueue/default_rate_limiters_test.go +++ b/util/workqueue/default_rate_limiters_test.go @@ -182,3 +182,24 @@ func TestMaxOfRateLimiter(t *testing.T) { } } + +func TestWithMaxWaitRateLimiter(t *testing.T) { + limiter := NewWithMaxWaitRateLimiter(DefaultControllerRateLimiter(), 500*time.Second) + for i := 0; i < 100; i++ { + if e, a := 5*time.Millisecond, limiter.When(i); e != a { + t.Errorf("expected %v, got %v", e, a) + } + } + + for i := 100; i < 5100; i++ { + if e, a := 500*time.Second, limiter.When(i); e < a { + t.Errorf("expected %v, got %v", e, a) + } + } + + for i := 5100; i < 5200; i++ { + if e, a := 500*time.Second, limiter.When(i); e != a { + t.Errorf("expected %v, got %v", e, a) + } + } +}