42 lines
720 B
Go
42 lines
720 B
Go
package custom_errors
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
func ComputeBackoffDelay(retryCounter int, baseDelayMs int, maxDelayMs int, maxJitterMs int) time.Duration {
|
|
if retryCounter < 0 {
|
|
retryCounter = 0
|
|
}
|
|
|
|
delay := max(time.Duration(baseDelayMs)*time.Millisecond, 0)
|
|
|
|
maxDelay := time.Duration(maxDelayMs) * time.Millisecond
|
|
for i := 0; i < retryCounter; i++ {
|
|
if maxDelayMs > 0 && delay >= maxDelay {
|
|
delay = maxDelay
|
|
break
|
|
}
|
|
if delay == 0 {
|
|
break
|
|
}
|
|
delay *= 2
|
|
}
|
|
|
|
if maxDelayMs > 0 && delay > maxDelay {
|
|
delay = maxDelay
|
|
}
|
|
|
|
if maxJitterMs > 0 {
|
|
jitter := time.Duration(rand.Intn(maxJitterMs+1)) * time.Millisecond
|
|
delay += jitter
|
|
}
|
|
|
|
if delay < 0 {
|
|
delay = 0
|
|
}
|
|
|
|
return delay
|
|
}
|