|
56 | 56 | API_VERSTRING = "v1/"
|
57 | 57 |
|
58 | 58 | class CountingBackoff(object):
|
59 |
| - def __init__(self, maximum_retries=10, timeout_success_equivalent=None): |
60 |
| - # type: (int, Optional[float]) -> None |
| 59 | + def __init__(self, maximum_retries=10, timeout_success_equivalent=None, delay_cap=10.0): |
| 60 | + # type: (int, Optional[float], float) -> None |
61 | 61 | self.number_of_retries = 0
|
62 | 62 | self.maximum_retries = maximum_retries
|
63 | 63 | self.timeout_success_equivalent = timeout_success_equivalent
|
64 | 64 | self.last_attempt_time = 0.0
|
| 65 | + self.delay_cap = delay_cap |
65 | 66 |
|
66 | 67 | def keep_going(self):
|
67 | 68 | # type: () -> bool
|
@@ -93,9 +94,9 @@ def fail(self):
|
93 | 94 | super(RandomExponentialBackoff, self).fail()
|
94 | 95 | # Exponential growth with ratio sqrt(2); compute random delay
|
95 | 96 | # between x and 2x where x is growing exponentially
|
96 |
| - delay_scale = int(2 ** (self.number_of_retries / 2.0 - 1)) + 1 |
97 |
| - delay = delay_scale + random.randint(1, delay_scale) |
98 |
| - message = "Sleeping for %ss [max %s] before retrying." % (delay, delay_scale * 2) |
| 97 | + delay_base = 0.5 |
| 98 | + delay = random.random() * min(self.delay_cap, delay_base * (2 ** self.number_of_retries)) |
| 99 | + message = "Sleeping for %ss before retrying." % (delay,) |
99 | 100 | try:
|
100 | 101 | logger.warning(message)
|
101 | 102 | except NameError:
|
|
0 commit comments