summaryrefslogtreecommitdiff
path: root/tooz/drivers/etcd3gw.py
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2017-07-05 12:50:16 +0000
committerGerrit Code Review <review@openstack.org>2017-07-05 12:50:16 +0000
commit03dbf70f701c322d422ea65dacdc05d08e83d303 (patch)
tree39825e1516e813d249e86dbfeb6204ddb8b4a3a8 /tooz/drivers/etcd3gw.py
parentd88f0f4c84f2c120dcbde2df8c7066d334a1eda6 (diff)
parent7987f4455a7ff4e75d64c46a42d50017f53bfc9e (diff)
downloadtooz-03dbf70f701c322d422ea65dacdc05d08e83d303.tar.gz
Merge "Make sure Lock.heartbeat() returns True/False"
Diffstat (limited to 'tooz/drivers/etcd3gw.py')
-rw-r--r--tooz/drivers/etcd3gw.py23
1 files changed, 17 insertions, 6 deletions
diff --git a/tooz/drivers/etcd3gw.py b/tooz/drivers/etcd3gw.py
index 1370f1c..c3367ca 100644
--- a/tooz/drivers/etcd3gw.py
+++ b/tooz/drivers/etcd3gw.py
@@ -14,6 +14,7 @@
from __future__ import absolute_import
import base64
+import threading
import uuid
import etcd3gw
@@ -68,6 +69,7 @@ class Etcd3Lock(locking.Lock):
self._key_b64 = base64.b64encode(self._key).decode("ascii")
self._uuid = base64.b64encode(uuid.uuid4().bytes).decode("ascii")
self._lease = self._coord.client.lease(self._timeout)
+ self._exclusive_access = threading.Lock()
@_translate_failures
def acquire(self, blocking=True, shared=False):
@@ -126,11 +128,12 @@ class Etcd3Lock(locking.Lock):
}]
}
- result = self._coord.client.transaction(txn)
- success = result.get('succeeded', False)
- if success:
- self._coord._acquired_locks.remove(self)
- return True
+ with self._exclusive_access:
+ result = self._coord.client.transaction(txn)
+ success = result.get('succeeded', False)
+ if success:
+ self._coord._acquired_locks.remove(self)
+ return True
return False
@_translate_failures
@@ -140,9 +143,17 @@ class Etcd3Lock(locking.Lock):
return True
return False
+ @property
+ def acquired(self):
+ return self in self._coord._acquired_locks
+
@_translate_failures
def heartbeat(self):
- self._lease.refresh()
+ with self._exclusive_access:
+ if self.acquired:
+ self._lease.refresh()
+ return True
+ return False
class Etcd3Driver(coordination.CoordinationDriver):