diff --git a/test/ganeti.locking_unittest.py b/test/ganeti.locking_unittest.py index 36d061839f121adffaae897cdbdfc4d5cbe290be..dac674f0441b28463d06363c5cf840694bac3bdd 100755 --- a/test/ganeti.locking_unittest.py +++ b/test/ganeti.locking_unittest.py @@ -494,6 +494,9 @@ class TestSharedLock(_ThreadedTestCase): # Start thread to hold lock for 20 ms self._addThread(target=_LockExclusive, args=(20.0 / 1000.0, )) + # Wait for sleep to begin + self.assertEqual(self.done.get(), "A: start sleep") + # Wait up to 100 ms to get lock self.failUnless(self.sl.acquire(shared=shared, timeout=0.1)) self.done.put("got 2nd") @@ -501,7 +504,6 @@ class TestSharedLock(_ThreadedTestCase): self._waitThreads() - self.assertEqual(self.done.get_nowait(), "A: start sleep") self.assertEqual(self.done.get_nowait(), "A: end sleep") self.assertEqual(self.done.get_nowait(), "got 2nd") self.assertRaises(Queue.Empty, self.done.get_nowait) @@ -565,8 +567,17 @@ class TestSharedLock(_ThreadedTestCase): self._addThread(target=_Acquire, args=(0, "exclusive D")) # Expect 6 pending exclusive acquires and 1 for all shared acquires - # together - self.assertEqual(self.sl._count_pending(), 7) + # together. There's no way to wait for SharedLock.acquire to start + # its work. Hence the timeout of 2 seconds. + pending = 0 + end_time = time.time() + 2.0 + while time.time() < end_time: + pending = self.sl._count_pending() + self.assert_(pending >= 0 and pending <= 7) + if pending == 7: + break + time.sleep(0.05) + self.assertEqual(pending, 7) # Release exclusive lock and wait self.sl.release() @@ -574,10 +585,18 @@ class TestSharedLock(_ThreadedTestCase): self._waitThreads() # Check sequence + shr_a = 0 + shr_c = 0 for _ in xrange(10): # Shared locks aren't guaranteed to be notified in order, but they'll be # first - self.assert_(self.done.get_nowait() in ("shared A", "shared C")) + tmp = self.done.get_nowait() + if tmp == "shared A": + shr_a += 1 + elif tmp == "shared C": + shr_c += 1 + self.assertEqual(shr_a, 5) + self.assertEqual(shr_c, 5) for _ in xrange(3): self.assertEqual(self.done.get_nowait(), "exclusive B")