62 lines
1009 B
Go
62 lines
1009 B
Go
package custom_errors
|
|
|
|
import (
|
|
"context"
|
|
"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
|
|
}
|
|
|
|
func requeueWithBackoff(ctx context.Context, delay time.Duration, enqueue func()) {
|
|
if delay <= 0 {
|
|
enqueue()
|
|
return
|
|
}
|
|
|
|
go func() {
|
|
timer := time.NewTimer(delay)
|
|
defer timer.Stop()
|
|
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case <-timer.C:
|
|
enqueue()
|
|
}
|
|
}()
|
|
}
|