diff options
author | Zuul <zuul@review.opendev.org> | 2023-02-14 16:25:42 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2023-02-14 16:25:42 +0000 |
commit | 1330b280778fa834cffbc4ec9a8aa6b04cb2471e (patch) | |
tree | 4eac1303dc7a049db97966e402cab286a41c854a | |
parent | a2964417822bd1a4a83fa5c27282d2be1e18868a (diff) | |
parent | 1778a9c589cf24e17b44f556680b17af9577df11 (diff) | |
download | nova-1330b280778fa834cffbc4ec9a8aa6b04cb2471e.tar.gz |
Merge "Add logging to find test cases leaking libvirt threads"
-rw-r--r-- | nova/tests/fixtures/nova.py | 26 | ||||
-rw-r--r-- | nova/virt/libvirt/driver.py | 18 |
2 files changed, 44 insertions, 0 deletions
diff --git a/nova/tests/fixtures/nova.py b/nova/tests/fixtures/nova.py index 5fd893e7dc..9a652c02cb 100644 --- a/nova/tests/fixtures/nova.py +++ b/nova/tests/fixtures/nova.py @@ -1822,6 +1822,24 @@ class ImportModulePoisonFixture(fixtures.Fixture): def find_spec(self, fullname, path, target=None): if fullname in self.modules: + current = eventlet.getcurrent() + # NOTE(gibi) not all eventlet spawn is under our control, so + # there can be senders without test_case_id set, find the first + # ancestor that was spawned from nova.utils.spawn[_n] and + # therefore has the id set. + while ( + current is not None and + not getattr(current, 'test_case_id', None) + ): + current = current.parent + + if current is not None: + self.test.tc_id = current.test_case_id + LOG.warning( + "!!!---!!! TestCase ID %s hit the import poison while " + "importing %s. If you see this in a failed functional " + "test then please let #openstack-nova on IRC know " + "about it. !!!---!!!", current.test_case_id, fullname) self.test.fail_message = ( f"This test imports the '{fullname}' module, which it " f'should not in the test environment. Please add ' @@ -1832,6 +1850,7 @@ class ImportModulePoisonFixture(fixtures.Fixture): def __init__(self, module_names): self.module_names = module_names self.fail_message = '' + self.tc_id = None if isinstance(module_names, str): self.module_names = {module_names} self.meta_path_finder = self.ForbiddenModules(self, self.module_names) @@ -1849,6 +1868,13 @@ class ImportModulePoisonFixture(fixtures.Fixture): # there (which is also what self.assert* and self.fail() do underneath) # will not work to cause a failure in the test. if self.fail_message: + if self.tc_id is not None: + LOG.warning( + "!!!---!!! TestCase ID %s hit the import poison. If you " + "see this in a failed functional test then please let " + "#openstack-nova on IRC know about it. !!!---!!!", + self.tc_id + ) raise ImportError(self.fail_message) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 542383cbad..5b0fa799c3 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -10061,6 +10061,24 @@ class LibvirtDriver(driver.ComputeDriver): :param instance: instance object that is in migration """ + current = eventlet.getcurrent() + # NOTE(gibi) not all eventlet spawn is under our control, so + # there can be senders without test_case_id set, find the first + # ancestor that was spawned from nova.utils.spawn[_n] and + # therefore has the id set. + while ( + current is not None and + not getattr(current, 'test_case_id', None) + ): + current = current.parent + + if current is not None: + LOG.warning( + "!!!---!!! live_migration_abort thread was spawned by " + "TestCase ID: %s. If you see this in a failed functional test " + "then please let #openstack-nova on IRC know about it. " + "!!!---!!!", current.test_case_id + ) guest = self._host.get_guest(instance) dom = guest._domain |