From: Jim Fehlig <[email protected]>

When migrating with VIR_MIGRATE_UNDEFINE_SOURCE, qemuMigrationSrcConfirm()
and qemuMigrationSrcPerformJob() delete the domain's persistent config on
the source host but never emit a VIR_DOMAIN_EVENT_UNDEFINED lifecycle
event. Applications relying solely on domain events never learn the domain
was undefined on the source. Emit the event, reusing the existing
VIR_DOMAIN_EVENT_UNDEFINED_REMOVED detail since the semantics match
virDomainUndefine().

Signed-off-by: Jim Fehlig <[email protected]>
---
 src/qemu/qemu_migration.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 797f83ca0d..f336437734 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -4279,6 +4279,7 @@ qemuMigrationSrcConfirm(virQEMUDriver *driver,
 {
     qemuMigrationJobPhase phase;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+    virObjectEvent *event = NULL;
     int ret = -1;
 
     VIR_DEBUG("vm=%p, flags=0x%x, cancelled=%d", vm, flags, cancelled);
@@ -4325,11 +4326,15 @@ qemuMigrationSrcConfirm(virQEMUDriver *driver,
         if (!cancelled && ret == 0 && flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
             virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
             vm->persistent = 0;
+            event = virDomainEventLifecycleNewFromObj(vm,
+                                             VIR_DOMAIN_EVENT_UNDEFINED,
+                                             
VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
         }
         qemuDomainRemoveInactive(vm, VIR_DOMAIN_UNDEFINE_TPM, true);
     }
 
  cleanup:
+    virObjectEventStateQueue(driver->domainEventState, event);
     virDomainObjEndAPI(&vm);
     return ret;
 }
@@ -6328,6 +6333,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
                            bool v3proto)
 {
     virObjectEvent *event = NULL;
+    virObjectEvent *undefine_event = NULL;
     int ret = -1;
     virErrorPtr orig_err = NULL;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
@@ -6419,6 +6425,9 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
         if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) {
             virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
             vm->persistent = 0;
+            undefine_event = virDomainEventLifecycleNewFromObj(vm,
+                                             VIR_DOMAIN_EVENT_UNDEFINED,
+                                             
VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
         }
         qemuDomainRemoveInactive(vm, 0, true);
     }
@@ -6427,6 +6436,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
 
  cleanup:
     virObjectEventStateQueue(driver->domainEventState, event);
+    virObjectEventStateQueue(driver->domainEventState, undefine_event);
     return ret;
 }
 
-- 
2.51.0

Reply via email to