From ac9a0aaf079d0222ab1ef58dcd58f9b2941a88a1 Mon Sep 17 00:00:00 2001 From: Joshua Gentes Date: Thu, 4 Aug 2016 17:09:58 -0400 Subject: [PATCH] Short-circuit the backoff algorithm. --- backoff.go | 5 +++++ backoff_test.go | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/backoff.go b/backoff.go index 4771894..a6380e0 100644 --- a/backoff.go +++ b/backoff.go @@ -39,6 +39,10 @@ func (b *Backoff) Duration() time.Duration { // ForAttempt is threadsafe iff non-zero values for Factor, Max, and Min // are set before any calls to ForAttempt are made. func (b *Backoff) ForAttempt(attempt float64) time.Duration { + if float64(b.Min) > float64(b.Max) { + return b.Max + } + //Zero-values are nonsensical, so we use //them to apply defaults if b.Min == 0 { @@ -50,6 +54,7 @@ func (b *Backoff) ForAttempt(attempt float64) time.Duration { if b.Factor == 0 { b.Factor = 2 } + //calculate this duration dur := float64(b.Min) * math.Pow(b.Factor, attempt) if b.Jitter == true { diff --git a/backoff_test.go b/backoff_test.go index 0d59ff8..02fc0d6 100644 --- a/backoff_test.go +++ b/backoff_test.go @@ -66,6 +66,16 @@ func Test3(t *testing.T) { equals(t, b.Duration(), 100*time.Nanosecond) } +func Test4(t *testing.T) { + b := &Backoff{ + Min: 500 * time.Second, + Max: 100 * time.Second, + Factor: 1, + } + + equals(t, b.Duration(), b.Max) +} + func TestGetAttempt(t *testing.T) { b := &Backoff{ Min: 100 * time.Millisecond,