diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-10-03 09:14:19 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-10-03 09:14:19 +0000 |
commit | df879dde96c7ee7a19f51de6cbb8620d7d2af385 (patch) | |
tree | 719c68153b5154063078dc33e7deb461a9794358 | |
parent | a9a065a1433c4a612a472c5170e3ce40885d1da6 (diff) | |
parent | aabe3c5e67cee64f55e21ed5b4d98696e0c7decd (diff) | |
download | tooz-df879dde96c7ee7a19f51de6cbb8620d7d2af385.tar.gz |
Merge "IPC: fix a potential race condition at init"
-rw-r--r-- | tooz/drivers/ipc.py | 22 |
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 |