From f4a5f91496e6dbe7001ae805177abb4171b85257 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 27 Mar 2023 10:17:05 +0100 Subject: [PATCH] Database: Don't sleep 10ms before every request (#64832) Previously every DB operation would wait 10ms before even trying. Now we try first, and defer creating the ticker until we need it. --- pkg/util/retryer/retryer.go | 36 +++++++++++++++----------------- pkg/util/retryer/retryer_test.go | 4 +--- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/pkg/util/retryer/retryer.go b/pkg/util/retryer/retryer.go index 8055f06841f2c..2600ce9842c52 100644 --- a/pkg/util/retryer/retryer.go +++ b/pkg/util/retryer/retryer.go @@ -1,14 +1,14 @@ package retryer import ( + "errors" "time" ) type RetrySignal = int const ( - FuncSuccess RetrySignal = iota - FuncFailure + FuncFailure RetrySignal = iota FuncComplete FuncError ) @@ -17,35 +17,33 @@ const ( // `maxDelay` after each failure. Stops when the provided function returns `FuncComplete`, or `maxRetries` is reached. func Retry(body func() (RetrySignal, error), maxRetries int, minDelay time.Duration, maxDelay time.Duration) error { currentDelay := minDelay - ticker := time.NewTicker(currentDelay) - defer ticker.Stop() + var ticker *time.Ticker retries := 0 - for range ticker.C { + for { response, err := body() if err != nil { return err } - - switch response { - case FuncSuccess: - currentDelay = minDelay - ticker.Reset(currentDelay) - retries = 0 - case FuncFailure: - currentDelay = minDuration(currentDelay*2, maxDelay) - ticker.Reset(currentDelay) - retries++ - case FuncComplete: + if response == FuncComplete { return nil } + retries++ if retries >= maxRetries { - return nil + return errors.New("max retries exceeded") } - } - return nil + if ticker == nil { + ticker = time.NewTicker(currentDelay) + defer ticker.Stop() + } else { + currentDelay = minDuration(currentDelay*2, maxDelay) + ticker.Reset(currentDelay) + } + + <-ticker.C + } } func minDuration(a time.Duration, b time.Duration) time.Duration { diff --git a/pkg/util/retryer/retryer_test.go b/pkg/util/retryer/retryer_test.go index 575762f602bd7..93e25c1da4d5b 100644 --- a/pkg/util/retryer/retryer_test.go +++ b/pkg/util/retryer/retryer_test.go @@ -14,9 +14,7 @@ func TestMaxRetries(t *testing.T) { retryVal++ return FuncFailure, nil }, 8, 100*time.Millisecond, 100*time.Millisecond) - if err != nil { - assert.FailNow(t, "Error while retrying function") - } + assert.Error(t, err) // Exceeding max-retries is an error. assert.Equal(t, 8, retryVal) }