Handle "no RAM info was set" migration case

This handles the case where the live migration monitoring thread may
race and call jobStats() after the migration has completed resulting in
the following error:

    libvirt.libvirtError: internal error: migration was active, but no
    RAM info was set

Closes-Bug: #1982284
Change-Id: I77fdfa9cffbd44b2889f49f266b2582bcc6a4267
This commit is contained in:
Brett Milford 2022-08-04 16:52:33 +10:00
parent 89ef050b8c
commit 9fea934c71
3 changed files with 40 additions and 0 deletions

View File

@ -1041,3 +1041,25 @@ class JobInfoTestCase(test.NoDBTestCase):
mock_stats.assert_called_once_with()
mock_info.assert_called_once_with()
@mock.patch.object(fakelibvirt.virDomain, "jobInfo")
@mock.patch.object(fakelibvirt.virDomain, "jobStats")
def test_job_stats_no_ram(self, mock_stats, mock_info):
mock_stats.side_effect = fakelibvirt.make_libvirtError(
fakelibvirt.libvirtError,
"internal error: migration was active, but no RAM info was set",
error_code=fakelibvirt.VIR_ERR_INTERNAL_ERROR,
error_message="migration was active, but no RAM info was set")
info = self.guest.get_job_info()
self.assertIsInstance(info, libvirt_guest.JobInfo)
self.assertEqual(fakelibvirt.VIR_DOMAIN_JOB_NONE, info.type)
self.assertEqual(0, info.time_elapsed)
self.assertEqual(0, info.time_remaining)
self.assertEqual(0, info.memory_total)
self.assertEqual(0, info.memory_processed)
self.assertEqual(0, info.memory_remaining)
mock_stats.assert_called_once_with()
self.assertFalse(mock_info.called)

View File

@ -655,6 +655,7 @@ class Guest(object):
stats = self._domain.jobStats()
return JobInfo(**stats)
except libvirt.libvirtError as ex:
errmsg = ex.get_error_message()
if ex.get_error_code() == libvirt.VIR_ERR_NO_SUPPORT:
# Remote libvirt doesn't support new API
LOG.debug("Missing remote virDomainGetJobStats: %s", ex)
@ -667,6 +668,12 @@ class Guest(object):
# away completclsely
LOG.debug("Domain has shutdown/gone away: %s", ex)
return JobInfo(type=libvirt.VIR_DOMAIN_JOB_COMPLETED)
elif (ex.get_error_code() == libvirt.VIR_ERR_INTERNAL_ERROR and
errmsg and "migration was active, "
"but no RAM info was set" in errmsg):
LOG.debug("Migration is active or completed but "
"virDomainGetJobStats is missing ram: %s", ex)
return JobInfo(type=libvirt.VIR_DOMAIN_JOB_NONE)
else:
LOG.debug("Failed to get job stats: %s", ex)
raise

View File

@ -0,0 +1,11 @@
---
other:
- |
A workaround has been added to the libvirt driver to catch and pass
migrations that were previously failing with the error:
``libvirt.libvirtError: internal error: migration was active, but no RAM info was set``
See `bug 1982284`_ for more details.
.. _bug 1982284: https://bugs.launchpad.net/nova/+bug/1982284