From ab5adfb2eff62d42e86a6bc4f4be4ff63c424a52 Mon Sep 17 00:00:00 2001 From: Oleksii Ivanov Date: Fri, 11 Dec 2020 14:14:02 +0200 Subject: [PATCH] Fix for no retries case. In case we don't wanna retry, it used the default retry counter, but it can be case when we don't need to retry and waiting time for the next attempt. --- redlock/__init__.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/redlock/__init__.py b/redlock/__init__.py index 70795f5..563110d 100644 --- a/redlock/__init__.py +++ b/redlock/__init__.py @@ -65,8 +65,14 @@ def __init__(self, connection_list, retry_count=None, retry_delay=None): if len(self.servers) < self.quorum: raise CannotObtainLock( "Failed to connect to the majority of redis servers") - self.retry_count = retry_count or self.default_retry_count - self.retry_delay = retry_delay or self.default_retry_delay + + self.retry_count = retry_count + if self.retry_count is None: + self.retry_count = self.default_retry_count + + self.retry_delay = retry_delay + if self.retry_delay is None: + self.retry_delay = self.default_retry_delay def lock_instance(self, server, resource, val, ttl): try: @@ -95,7 +101,8 @@ def lock(self, resource, ttl): drift = int(ttl * self.clock_drift_factor) + 2 redis_errors = list() - while retry < self.retry_count: + restart_attempt = True + while restart_attempt: n = 0 start_time = int(time.time() * 1000) del redis_errors[:] @@ -117,8 +124,12 @@ def lock(self, resource, ttl): self.unlock_instance(server, resource, val) except: pass + retry += 1 - time.sleep(self.retry_delay) + restart_attempt = retry < self.retry_count + if restart_attempt: + time.sleep(self.retry_delay) + return False def unlock(self, lock):