...
1 package waiter
2
3 import (
4 "fmt"
5 "math"
6 "time"
7
8 "github.com/aws/smithy-go/rand"
9 )
10
11
12
13
14
15
16
17 func ComputeDelay(attempt int64, minDelay, maxDelay, remainingTime time.Duration) (delay time.Duration, err error) {
18
19 if attempt <= 0 {
20 return 0, nil
21 }
22
23
24 if remainingTime <= 0 {
25 return 0, nil
26 }
27
28
29 if minDelay == 0 {
30 return 0, fmt.Errorf("minDelay must be greater than zero when computing Delay")
31 }
32
33
34 if maxDelay == 0 {
35 return 0, fmt.Errorf("maxDelay must be greater than zero when computing Delay")
36 }
37
38
39 attemptCeiling := (math.Log(float64(maxDelay/minDelay)) / math.Log(2)) + 1
40
41 if attempt > int64(attemptCeiling) {
42 delay = maxDelay
43 } else {
44
45 ri := 1 << uint64(attempt-1)
46
47 delay = minDelay * time.Duration(ri)
48 }
49
50 if delay != minDelay {
51
52 d, err := rand.CryptoRandInt63n(int64(delay - minDelay))
53 if err != nil {
54 return 0, fmt.Errorf("error computing retry jitter, %w", err)
55 }
56
57 delay = time.Duration(d) + minDelay
58 }
59
60
61 if remainingTime-delay <= minDelay {
62 delay = remainingTime - minDelay
63 }
64
65 return delay, nil
66 }
67
View as plain text