Short-circuit the backoff algorithm.

This commit is contained in:
Joshua Gentes 2016-08-04 17:09:58 -04:00
parent ed03cf77f8
commit ac9a0aaf07
2 changed files with 15 additions and 0 deletions

View File

@ -39,6 +39,10 @@ func (b *Backoff) Duration() time.Duration {
// ForAttempt is threadsafe iff non-zero values for Factor, Max, and Min // ForAttempt is threadsafe iff non-zero values for Factor, Max, and Min
// are set before any calls to ForAttempt are made. // are set before any calls to ForAttempt are made.
func (b *Backoff) ForAttempt(attempt float64) time.Duration { 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 //Zero-values are nonsensical, so we use
//them to apply defaults //them to apply defaults
if b.Min == 0 { if b.Min == 0 {
@ -50,6 +54,7 @@ func (b *Backoff) ForAttempt(attempt float64) time.Duration {
if b.Factor == 0 { if b.Factor == 0 {
b.Factor = 2 b.Factor = 2
} }
//calculate this duration //calculate this duration
dur := float64(b.Min) * math.Pow(b.Factor, attempt) dur := float64(b.Min) * math.Pow(b.Factor, attempt)
if b.Jitter == true { if b.Jitter == true {

View File

@ -66,6 +66,16 @@ func Test3(t *testing.T) {
equals(t, b.Duration(), 100*time.Nanosecond) 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) { func TestGetAttempt(t *testing.T) {
b := &Backoff{ b := &Backoff{
Min: 100 * time.Millisecond, Min: 100 * time.Millisecond,