From 26082b7eb795cfbdf3dca0d86c808789687e4a62 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Wed, 21 Mar 2012 14:54:39 +0100 Subject: [PATCH] locking: Fix lock deletion with timeout While working on another SharedLock fix I realized timeouts on lock deletion don't work very well if the timeout actually expires. This patch fixes the issue and adds a new unittest. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Bernardo Dal Seno <bdalseno@google.com> --- lib/locking.py | 2 +- test/ganeti.locking_unittest.py | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/locking.py b/lib/locking.py index 5b7414dcf..a0e418e99 100644 --- a/lib/locking.py +++ b/lib/locking.py @@ -840,10 +840,10 @@ class SharedLock(object): if not acquired: acquired = self.__acquire_unlocked(0, timeout, priority) + if acquired: assert self.__is_exclusive() and not self.__is_sharer(), \ "Lock wasn't acquired in exclusive mode" - if acquired: self.__deleted = True self.__exc = None diff --git a/test/ganeti.locking_unittest.py b/test/ganeti.locking_unittest.py index 138e016b5..c8a6807fc 100755 --- a/test/ganeti.locking_unittest.py +++ b/test/ganeti.locking_unittest.py @@ -433,7 +433,31 @@ class TestSharedLock(_ThreadedTestCase): self.assertRaises(errors.LockError, self.sl.delete) def testDeleteTimeout(self): - self.sl.delete(timeout=60) + self.assertTrue(self.sl.delete(timeout=60)) + + def testDeleteTimeoutFail(self): + ready = threading.Event() + finish = threading.Event() + + def fn(): + self.sl.acquire(shared=0) + ready.set() + + finish.wait() + self.sl.release() + + self._addThread(target=fn) + ready.wait() + + # Test if deleting a lock owned in exclusive mode by another thread fails + # to delete when a timeout is used + self.assertFalse(self.sl.delete(timeout=0.02)) + + finish.set() + self._waitThreads() + + self.assertTrue(self.sl.delete()) + self.assertRaises(errors.LockError, self.sl.acquire) def testNoDeleteIfSharer(self): self.sl.acquire(shared=1) -- GitLab