summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-10-03 09:14:19 +0000
committerGerrit Code Review <review@openstack.org>2014-10-03 09:14:19 +0000
commitdf879dde96c7ee7a19f51de6cbb8620d7d2af385 (patch)
tree719c68153b5154063078dc33e7deb461a9794358
parenta9a065a1433c4a612a472c5170e3ce40885d1da6 (diff)
parentaabe3c5e67cee64f55e21ed5b4d98696e0c7decd (diff)
downloadtooz-df879dde96c7ee7a19f51de6cbb8620d7d2af385.tar.gz
Merge "IPC: fix a potential race condition at init"
-rw-r--r--tooz/drivers/ipc.py22
1 files changed, 16 insertions, 6 deletions
diff --git a/tooz/drivers/ipc.py b/tooz/drivers/ipc.py
index 905680c..5184ac7 100644
--- a/tooz/drivers/ipc.py
+++ b/tooz/drivers/ipc.py
@@ -45,12 +45,22 @@ class IPCLock(locking.Lock):
def __init__(self, name, timeout):
super(IPCLock, self).__init__(name)
self.key = self.ftok(name, self._LOCK_PROJECT)
- try:
- self._lock = sysv_ipc.Semaphore(self.key,
- flags=sysv_ipc.IPC_CREX,
- initial_value=1)
- except sysv_ipc.ExistentialError:
- self._lock = sysv_ipc.Semaphore(self.key)
+ while True:
+ try:
+ # Try to create the lock
+ self._lock = sysv_ipc.Semaphore(self.key,
+ flags=sysv_ipc.IPC_CREX,
+ initial_value=1)
+ except sysv_ipc.ExistentialError:
+ # We failed to create it because it already exists, then try to
+ # grab the existing one.
+ try:
+ self._lock = sysv_ipc.Semaphore(self.key)
+ except sysv_ipc.ExistentialError:
+ # Semaphore has been deleted in the mean time, retry from
+ # the beginning!
+ pass
+ break
self._lock.undo = True
self.timeout = timeout