diff --git a/test/ganeti.locking_unittest.py b/test/ganeti.locking_unittest.py index bbfe693f20625e467c7b7be500b3d012e09e4fa9..c1ea3130b77ce351f9b324ef91a45b8a93846027 100755 --- a/test/ganeti.locking_unittest.py +++ b/test/ganeti.locking_unittest.py @@ -1503,9 +1503,10 @@ class TestLockMonitor(_ThreadedTestCase): tlock.release() # Test shared acquire - def _Acquire(lock, shared, ev): + def _Acquire(lock, shared, ev, notify): lock.acquire(shared=shared) try: + notify.set() ev.wait() finally: lock.release() @@ -1513,21 +1514,38 @@ class TestLockMonitor(_ThreadedTestCase): for tlock1 in locks[::11]: for tlock2 in locks[::-15]: if tlock2 == tlock1: + # Avoid deadlocks continue for tlock3 in locks[::10]: - if tlock3 == tlock2: + if tlock3 in (tlock2, tlock1): + # Avoid deadlocks continue - ev = threading.Event() + releaseev = threading.Event() # Acquire locks + acquireev = [] tthreads1 = [] for i in range(3): + ev = threading.Event() tthreads1.append(self._addThread(target=_Acquire, - args=(tlock1, 1, ev))) - tthread2 = self._addThread(target=_Acquire, args=(tlock2, 1, ev)) - tthread3 = self._addThread(target=_Acquire, args=(tlock3, 0, ev)) + args=(tlock1, 1, releaseev, ev))) + acquireev.append(ev) + + ev = threading.Event() + tthread2 = self._addThread(target=_Acquire, + args=(tlock2, 1, releaseev, ev)) + acquireev.append(ev) + + ev = threading.Event() + tthread3 = self._addThread(target=_Acquire, + args=(tlock3, 0, releaseev, ev)) + acquireev.append(ev) + + # Wait for all locks to be acquired + for i in acquireev: + i.wait() # Check query result for (name, mode, owner) in self.lm.QueryLocks(["name", "mode", @@ -1552,7 +1570,7 @@ class TestLockMonitor(_ThreadedTestCase): self.assert_(owner is None) # Release locks again - ev.set() + releaseev.set() self._waitThreads()