util/backoff.go (24 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package util
import (
"math"
"time"
)
const (
minBackoffDuration = 250 * time.Millisecond
maxBackoffDuration = 5 * time.Second
base = 2.0
)
// GetExponentialBackoff returns a Duration that increases exponentially with
// the number of attempts.
func GetExponentialBackoff(attempt int) time.Duration {
if attempt <= 0 {
return minBackoffDuration
}
durationf := float64(minBackoffDuration) * math.Pow(base, float64(attempt))
if durationf > math.MaxInt64 {
return maxBackoffDuration
}
duration := time.Duration(durationf)
if duration > maxBackoffDuration {
return maxBackoffDuration
}
return duration
}