libvirt: Add announce-self post live-migration workaround

This patch adds a workaround that can be enabled
to send an announce_self QEMU monitor command
post live-migration to send out RARP frames
that was lost due to port binding or flows not
being installed.

Please note that this makes marks the domain
in libvirt as tainted.

See previous information about this issue in
the [1] bug.

[1] https://bugs.launchpad.net/nova/+bug/1815989

Change-Id: I7a6a6fe5f5b23e76948b59a85ca9be075a1c2d6d
Related-Bug: 1815989
This commit is contained in:
Tobias Urdin
2020-07-16 21:29:32 +02:00
parent b49b7663e1
commit d44e24efe2
4 changed files with 50 additions and 0 deletions
+11
View File
@@ -358,6 +358,17 @@ backend.
Related options:
* :oslo.config:option:`DEFAULT.vif_plugging_timeout`
"""),
cfg.BoolOpt('enable_qemu_monitor_announce_self',
default=False,
help="""
If it is set to True the libvirt driver will try as a best effort to send
the announce-self command to the QEMU monitor so that it generates RARP frames
to update network switches in the post live migration phase on the destination.
Related options:
* :oslo.config:option:`DEFAULT.compute_driver` (libvirt)
"""),
]
+21
View File
@@ -10550,6 +10550,26 @@ class LibvirtDriver(driver.ComputeDriver):
"""
self.unplug_vifs(instance, network_info)
def _qemu_monitor_announce_self(self, instance):
"""Send announce_self command to QEMU monitor.
This is to trigger generation of broadcast RARP frames to
update network switches. This is best effort.
"""
if not CONF.workarounds.enable_qemu_monitor_announce_self:
return
LOG.info('Sending announce-self command to QEMU monitor',
instance=instance)
try:
guest = self._host.get_guest(instance)
guest.announce_self()
except Exception:
LOG.warning('Failed to send announce-self command to QEMU monitor',
instance=instance)
LOG.exception()
def post_live_migration_at_destination(self, context,
instance,
network_info,
@@ -10565,6 +10585,7 @@ class LibvirtDriver(driver.ComputeDriver):
:param block_migration: if true, post operation of block_migration.
"""
self._reattach_instance_vifs(context, instance, network_info)
self._qemu_monitor_announce_self(instance)
def _get_instance_disk_info_from_config(self, guest_config,
block_device_info):
+10
View File
@@ -48,6 +48,12 @@ if ty.TYPE_CHECKING:
else:
libvirt = None
try:
import libvirtmod_qemu
except ImportError:
libvirtmod_qemu = None
LOG = logging.getLogger(__name__)
VIR_DOMAIN_NOSTATE = 0
@@ -632,6 +638,10 @@ class Guest(object):
"""Switch running live migration to post-copy mode"""
self._domain.migrateStartPostCopy()
def announce_self(self):
libvirtmod_qemu.virDomainQemuMonitorCommand(
self._domain._o, 'announce_self', 1)
def get_job_info(self):
"""Get job info for the domain
@@ -0,0 +1,8 @@
---
features:
- |
Added a new configuration option ``[workarounds]/enable_qemu_monitor_announce_self``
that when enabled causes the Libvirt driver to send a announce_self QEMU
monitor command post live-migration. Please see `bug 1815989 <https://bugs.launchpad.net/nova/+bug/1815989>`_
for more details. Please note that this causes the domain to be considered
tainted by libvirt.