diff --git a/nova/conf/workarounds.py b/nova/conf/workarounds.py index 26b834b47ef8..ea68b8e739ab 100644 --- a/nova/conf/workarounds.py +++ b/nova/conf/workarounds.py @@ -422,6 +422,19 @@ 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. + +Please note that this causes the domain to be considered tainted by libvirt. + +Related options: + +* :oslo.config:option:`DEFAULT.compute_driver` (libvirt) """), ] diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index f86ad2e1617b..2c6dab389162 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -10410,6 +10410,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, @@ -10425,6 +10445,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): diff --git a/nova/virt/libvirt/guest.py b/nova/virt/libvirt/guest.py index 54e63e42928c..53080e41f0b4 100644 --- a/nova/virt/libvirt/guest.py +++ b/nova/virt/libvirt/guest.py @@ -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 diff --git a/releasenotes/notes/announce-self-post-live-migration-936721b1ab887514.yaml b/releasenotes/notes/announce-self-post-live-migration-936721b1ab887514.yaml new file mode 100644 index 000000000000..f0ec39f196bd --- /dev/null +++ b/releasenotes/notes/announce-self-post-live-migration-936721b1ab887514.yaml @@ -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 `_ + for more details. Please note that this causes the domain to be considered + tainted by libvirt.