diff --git a/astara/test/unit/test_worker.py b/astara/test/unit/test_worker.py index 4ba77506..84c59bf3 100644 --- a/astara/test/unit/test_worker.py +++ b/astara/test/unit/test_worker.py @@ -333,6 +333,28 @@ class TestWorker(WorkerTestBase): self._test__should_process_command( fake_hash, cmds=cmds, key=DC_KEY, negative=True) + def test__release_resource_lock(self): + resource_id = '0ae77286-c0d6-11e5-9181-525400137dfc' + fake_lock = mock.Mock(release=mock.Mock()) + + self.w._resource_locks = { + resource_id: fake_lock + } + fake_sm = mock.Mock(resource_id=resource_id) + self.w._release_resource_lock(fake_sm) + self.assertTrue(fake_lock.release.called) + + def test__release_resource_lock_unlocked(self): + resource_id = '0ae77286-c0d6-11e5-9181-525400137dfc' + fake_lock = mock.Mock(release=mock.Mock()) + fake_lock.release.side_effect = threading.ThreadError() + self.w._resource_locks = { + resource_id: fake_lock + } + fake_sm = mock.Mock(resource_id=resource_id) + # just ensure we dont raise + self.w._release_resource_lock(fake_sm) + class TestResourceCache(WorkerTestBase): def setUp(self): diff --git a/astara/worker.py b/astara/worker.py index cf64e2f6..079710a8 100644 --- a/astara/worker.py +++ b/astara/worker.py @@ -678,7 +678,11 @@ class Worker(object): LOG.debug('%s is already in the work queue', sm.resource_id) def _release_resource_lock(self, sm): - self._resource_locks[sm.resource_id].release() + try: + self._resource_locks[sm.resource_id].release() + except threading.ThreadError: + # Already unlocked, that's OK. + pass def report_status(self, show_config=True): if show_config: