summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Guðmundsson <andreasg@nasarde.org>2018-09-26 22:08:11 +0200
committerJeff Widman <jeff@jeffwidman.com>2018-09-26 13:08:11 -0700
commit60366d2c7910fc833991fad8e04bbe33817c0544 (patch)
treea06e989e098f8e02baca6c8ef55bfebe80f1e1db
parent35ce10669ace9d0d7e787793f0d4937d5d389f69 (diff)
downloadkazoo-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.py2
-rw-r--r--kazoo/retry.py11
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: