Fix lock leaks in unit tests

Following message was seen during unit tests:
"BUG: node lock was not released by the moment node info object is deleted."

Though the bug was marked invalid before, apparently it had never been resolved.
Tests involved in this patch were located by saving stack at NodeInfo.__init__ and
printing out at NodeInfo.__del__, without promises, but hopefully covers all tests
in current repo.

Change-Id: I678407b350bd07926eb98db30f24cc83747fa84c
Story: #1533595
Task: #11296
This commit is contained in:
Kaifeng Wang 2018-08-06 17:03:36 +08:00
parent 292c168d9e
commit 269d92b19c
2 changed files with 13 additions and 1 deletions

View File

@ -237,6 +237,7 @@ class TestNodeCacheFind(test_base.NodeTest):
def test_bmc(self):
res = node_cache.find_node(bmc_address='1.2.3.4')
self.addCleanup(res.release_lock)
self.assertEqual(self.uuid, res.uuid)
self.assertTrue(
datetime.datetime.utcnow() - datetime.timedelta(seconds=60)
@ -251,8 +252,10 @@ class TestNodeCacheFind(test_base.NodeTest):
bmc_address='1.2.3.4',
mac=self.macs2)
res = node_cache.find_node(bmc_address='1.2.3.4', mac=self.macs)
self.addCleanup(res.release_lock)
self.assertEqual(self.uuid, res.uuid)
res = node_cache.find_node(bmc_address='1.2.3.4', mac=self.macs2)
self.addCleanup(res.release_lock)
self.assertEqual(uuid2, res.uuid)
def test_same_bmc_raises(self):
@ -265,6 +268,7 @@ class TestNodeCacheFind(test_base.NodeTest):
def test_macs(self):
res = node_cache.find_node(mac=['11:22:33:33:33:33', self.macs[1]])
self.addCleanup(res.release_lock)
self.assertEqual(self.uuid, res.uuid)
self.assertTrue(
datetime.datetime.utcnow() - datetime.timedelta(seconds=60)
@ -287,6 +291,7 @@ class TestNodeCacheFind(test_base.NodeTest):
def test_both(self):
res = node_cache.find_node(bmc_address='1.2.3.4',
mac=self.macs)
self.addCleanup(res.release_lock)
self.assertEqual(self.uuid, res.uuid)
self.assertTrue(
datetime.datetime.utcnow() - datetime.timedelta(seconds=60)
@ -459,7 +464,7 @@ class TestNodeCacheGetNode(test_base.NodeTest):
state=istate.States.starting,
started_at=started_at).save(session)
info = node_cache.get_node(self.uuid, locked=True)
self.addCleanup(info.release_lock)
self.assertEqual(self.uuid, info.uuid)
self.assertEqual(started_at, info.started_at)
self.assertIsNone(info.finished_at)
@ -852,6 +857,7 @@ class TestNodeCacheGetByPath(test_base.NodeTest):
class TestLock(test_base.NodeTest):
def test_acquire(self, get_lock_mock):
node_info = node_cache.NodeInfo(self.uuid)
self.addCleanup(node_info.release_lock)
self.assertFalse(node_info._locked)
get_lock_mock.assert_called_once_with(self.uuid)
self.assertFalse(get_lock_mock.return_value.acquire.called)
@ -875,6 +881,7 @@ class TestLock(test_base.NodeTest):
def test_acquire_non_blocking(self, get_lock_mock):
node_info = node_cache.NodeInfo(self.uuid)
self.addCleanup(node_info.release_lock)
self.assertFalse(node_info._locked)
get_lock_mock.return_value.acquire.side_effect = iter([False, True])

View File

@ -74,6 +74,11 @@ class BaseProcessTest(BaseTest):
self.cli.node.get.return_value = self.node
self.process_mock = self.process_fixture.mock
self.process_mock.return_value = self.fake_result_json
self.addCleanup(self._cleanup_lock, self.node_info)
def _cleanup_lock(self, node_info):
if node_info._locked:
node_info.release_lock()
class TestProcess(BaseProcessTest):