| // Copyright 2016 Michal Witkowski. All Rights Reserved. |
| // See LICENSE for licensing terms. |
| |
| /* |
| Backoff Helper Utilities |
| |
| Implements common backoff features. |
| */ |
| package backoffutils |
| |
| import ( |
| "math/rand" |
| "time" |
| ) |
| |
| // JitterUp adds random jitter to the duration. |
| // |
| // This adds or subtracts time from the duration within a given jitter fraction. |
| // For example for 10s and jitter 0.1, it will return a time within [9s, 11s]) |
| func JitterUp(duration time.Duration, jitter float64) time.Duration { |
| multiplier := jitter * (rand.Float64()*2 - 1) |
| return time.Duration(float64(duration) * (1 + multiplier)) |
| } |
| |
| // ExponentBase2 computes 2^(a-1) where a >= 1. If a is 0, the result is 0. |
| func ExponentBase2(a uint) uint { |
| return (1 << a) >> 1 |
| } |