diff options
author | Andreas Guðmundsson <andreasg@nasarde.org> | 2018-09-26 22:08:11 +0200 |
---|---|---|
committer | Jeff Widman <jeff@jeffwidman.com> | 2018-09-26 13:08:11 -0700 |
commit | 60366d2c7910fc833991fad8e04bbe33817c0544 (patch) | |
tree | a06e989e098f8e02baca6c8ef55bfebe80f1e1db | |
parent | 35ce10669ace9d0d7e787793f0d4937d5d389f69 (diff) | |
download | kazoo-60366d2c7910fc833991fad8e04bbe33817c0544.tar.gz |
fix(core): change KazooRetry to uniformly jitter over the whole backoff interval (#521)
The previous implementation would add a fixed amount of jitter around
the calculated back-off time. Retry attempts were thus clustered
around the exponentially spaced backoff points.
This patch does exponential backoff but uniformly spreads the retries
over an interval [0, backoff**attempt]
-rw-r--r-- | kazoo/client.py | 2 | ||||
-rw-r--r-- | kazoo/retry.py | 11 |
2 files changed, 3 insertions, 10 deletions
diff --git a/kazoo/client.py b/kazoo/client.py index 1b0ff30..3391b71 100644 --- a/kazoo/client.py +++ b/kazoo/client.py @@ -79,7 +79,6 @@ _RETRY_COMPAT_DEFAULTS = dict( max_retries=None, retry_delay=0.1, retry_backoff=2, - retry_jitter=0.8, retry_max_delay=3600, ) @@ -87,7 +86,6 @@ _RETRY_COMPAT_MAPPING = dict( max_retries='max_tries', retry_delay='delay', retry_backoff='backoff', - retry_jitter='max_jitter', retry_max_delay='max_delay', ) diff --git a/kazoo/retry.py b/kazoo/retry.py index 72bd9f2..ce0178a 100644 --- a/kazoo/retry.py +++ b/kazoo/retry.py @@ -42,19 +42,17 @@ class KazooRetry(object): SessionExpiredError, ) - def __init__(self, max_tries=1, delay=0.1, backoff=2, max_jitter=0.8, + def __init__(self, max_tries=1, delay=0.1, backoff=2, max_delay=60, ignore_expire=True, sleep_func=time.sleep, deadline=None, interrupt=None): """Create a :class:`KazooRetry` instance for retrying function - calls + calls with uniform jitter :param max_tries: How many times to retry the command. -1 means infinite tries. :param delay: Initial delay between retry attempts. :param backoff: Backoff multiplier between retry attempts. Defaults to 2 for exponential backoff. - :param max_jitter: Additional max jitter period to wait between - retry attempts to avoid slamming the server. :param max_delay: Maximum delay in seconds, regardless of other backoff settings. Defaults to one minute. :param ignore_expire: @@ -70,7 +68,6 @@ class KazooRetry(object): self.max_tries = max_tries self.delay = delay self.backoff = backoff - self.max_jitter = int(max_jitter * 100) self.max_delay = float(max_delay) self._attempts = 0 self._cur_delay = delay @@ -93,7 +90,6 @@ class KazooRetry(object): obj = KazooRetry(max_tries=self.max_tries, delay=self.delay, backoff=self.backoff, - max_jitter=self.max_jitter / 100.0, max_delay=self.max_delay, sleep_func=self.sleep_func, deadline=self.deadline, @@ -129,8 +125,7 @@ class KazooRetry(object): if self._attempts == self.max_tries: raise RetryFailedError("Too many retry attempts") self._attempts += 1 - sleeptime = self._cur_delay + ( - random.randint(0, self.max_jitter) / 100.0) + sleeptime = random.randint(0, 1 + int(self._cur_delay)) if self._cur_stoptime is not None and \ time.time() + sleeptime >= self._cur_stoptime: |