From 35ca3e5d9b9bafcc29e0069281b15442a2518213 Mon Sep 17 00:00:00 2001 From: Karthic Rao Date: Wed, 1 Feb 2017 22:47:32 +0530 Subject: [PATCH] Fix unresponsiveness of `doneCh` due to Sleep call. (#3667) --- cmd/retry.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) 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