diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:36:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:36:04 +0000 |
commit | b09c6d56832eb1718c07d74abf3bc6ae3fe4e030 (patch) | |
tree | d2caec2610d4ea887803ec9e9c3cd77136c448ba /pkg/backoff | |
parent | Initial commit. (diff) | |
download | icingadb-upstream.tar.xz icingadb-upstream.zip |
Adding upstream version 1.1.0.upstream/1.1.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'pkg/backoff')
-rw-r--r-- | pkg/backoff/backoff.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/pkg/backoff/backoff.go b/pkg/backoff/backoff.go new file mode 100644 index 0000000..6ce7bee --- /dev/null +++ b/pkg/backoff/backoff.go @@ -0,0 +1,43 @@ +package backoff + +import ( + "math/rand" + "time" +) + +// Backoff returns the backoff duration for a specific retry attempt. +type Backoff func(uint64) time.Duration + +// NewExponentialWithJitter returns a backoff implementation that +// exponentially increases the backoff duration for each retry from min, +// never exceeding max. Some randomization is added to the backoff duration. +// It panics if min >= max. +func NewExponentialWithJitter(min, max time.Duration) Backoff { + if min <= 0 { + min = time.Millisecond * 100 + } + if max <= 0 { + max = time.Second * 10 + } + if min >= max { + panic("max must be larger than min") + } + + return func(attempt uint64) time.Duration { + e := min << attempt + if e <= 0 || e > max { + e = max + } + + return time.Duration(jitter(int64(e))) + } +} + +// jitter returns a random integer distributed in the range [n/2..n). +func jitter(n int64) int64 { + if n == 0 { + return 0 + } + + return n/2 + rand.Int63n(n/2) +} |