Skip to content

Commit cf83a6f

Browse files
committed
api: Improve and optimize Random Exponential Backoff algorithm.
Fixes #537.
1 parent 32a46cb commit cf83a6f

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

zulip/zulip/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@
5656
API_VERSTRING = "v1/"
5757

5858
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
6161
self.number_of_retries = 0
6262
self.maximum_retries = maximum_retries
6363
self.timeout_success_equivalent = timeout_success_equivalent
6464
self.last_attempt_time = 0.0
65+
self.delay_cap = delay_cap
6566

6667
def keep_going(self):
6768
# type: () -> bool
@@ -93,9 +94,9 @@ def fail(self):
9394
super(RandomExponentialBackoff, self).fail()
9495
# Exponential growth with ratio sqrt(2); compute random delay
9596
# 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,)
99100
try:
100101
logger.warning(message)
101102
except NameError:

0 commit comments

Comments
 (0)