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:
parent
89ef050b8c
commit
9fea934c71
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user