Skip to content

Commit a96b1e4

Browse files
committed
Fix handling of retry failures in Lock.acquire
(Fixes #288) - Make sure that self.node always exists. - Use _best_effort_cleanup() instead of _delete_node() when we didn't get the lock. - Make RetryFailedError use the existing cleanup code. - Make _best_effort_cleanup use self.node if it's set, and fall back to _find_node otherwise.
1 parent 9d43660 commit a96b1e4

1 file changed

Lines changed: 4 additions & 4 deletions

File tree

kazoo/recipe/lock.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def __init__(self, client, path, identifier=None):
8686
# some data is written to the node. this can be queried via
8787
# contenders() to see who is contending for the lock
8888
self.data = str(identifier or "").encode('utf-8')
89+
self.node = None
8990

9091
self.wake_event = client.handler.event_object()
9192

@@ -159,8 +160,7 @@ def _acquire_lock():
159160
gotten = retry(self._inner_acquire,
160161
blocking=blocking, timeout=timeout)
161162
except RetryFailedError:
162-
if not already_acquired:
163-
self._best_effort_cleanup()
163+
pass
164164
except KazooException:
165165
# if we did ultimately fail, attempt to clean up
166166
exc_info = sys.exc_info()
@@ -171,7 +171,7 @@ def _acquire_lock():
171171
if gotten:
172172
self.is_acquired = gotten
173173
if not gotten and not already_acquired:
174-
self._delete_node(self.node)
174+
self._best_effort_cleanup()
175175
return gotten
176176
finally:
177177
self._lock.release()
@@ -267,7 +267,7 @@ def _delete_node(self, node):
267267

268268
def _best_effort_cleanup(self):
269269
try:
270-
node = self._find_node()
270+
node = self.node or self._find_node()
271271
if node:
272272
self._delete_node(node)
273273
except KazooException: # pragma: nocover

0 commit comments

Comments
 (0)