diff --git a/cmd/retry.go b/cmd/retry.go index d3ad59e20..79d0b5f4d 100644 --- a/cmd/retry.go +++ b/cmd/retry.go @@ -91,16 +91,26 @@ func newRetryTimer(unit time.Duration, cap time.Duration, jitter float64, doneCh go func() { defer close(attemptCh) nextBackoff := 0 + // Channel used to signal after the expiry of backoff wait seconds. + var timer *time.Timer for { - select { - // Attempts starts. + select { // Attempts starts. case attemptCh <- nextBackoff: nextBackoff++ case <-doneCh: // Stop the routine. return } - time.Sleep(exponentialBackoffWait(nextBackoff)) + timer = time.NewTimer(exponentialBackoffWait(nextBackoff)) + // wait till next backoff time or till doneCh gets a message. + select { + case <-timer.C: + case <-doneCh: + // stop the timer and return. + timer.Stop() + return + } + } }() return attemptCh