[PATCH] qemu: Make migration fail when port profile association fails on the dst host

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In the current V3 migration protocol, Libvirt does not
check the result of the function

  qemuMigrationVPAssociatePortProfiles

This means that it is possible for a migration to complete
successfully even when the VM loses network connectivity on
the destination host.

With this change libvirt aborts the migration
(during the "finish" step) when the above function fails, that
is to say when at least one of the port profile associations fails.

Signed-off by: Christian Benvenuti <benve@xxxxxxxxx>

---
 src/qemu/qemu_migration.c |   24 ++++++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 802785f..38fbf83 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2716,7 +2716,7 @@ qemuMigrationPerform(struct qemud_driver *driver,
     }
 }
 
-static void
+static int
 qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
     int i;
     int last_good_net = -1;
@@ -2731,13 +2731,17 @@
qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
 
virDomainNetGetActualDirectDev(net),
                                                -1,
                                                def->uuid,
-
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH, false) < 0)
+
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH,
+                                               false) < 0) {
+                VIR_ERROR("Port profile Associate failed for %s",
net->ifname);
                 goto err_exit;
+            }
+            VIR_DEBUG("Port profile Associate succeeded for %s",
net->ifname);
         }
         last_good_net = i;
     }
 
-    return;
+    return 0;
 
 err_exit:
     for (i = 0; i < last_good_net; i++) {
@@ -2751,6 +2755,7 @@ err_exit:
 
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH));
         }
     }
+    return -1;
 }
 
 
@@ -2805,7 +2810,18 @@ qemuMigrationFinish(struct qemud_driver *driver,
             goto endjob;
         }
 
-        qemuMigrationVPAssociatePortProfiles(vm->def);
+        if (qemuMigrationVPAssociatePortProfiles(vm->def) < 0) {
+            qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_FAILED);
+            virDomainAuditStop(vm, "failed");
+            event = virDomainEventNewFromObj(vm,
+                                             VIR_DOMAIN_EVENT_STOPPED,
+
VIR_DOMAIN_EVENT_STOPPED_FAILED);
+            goto endjob;
+        }
 
         if (flags & VIR_MIGRATE_PERSIST_DEST) {
             virDomainDefPtr vmdef;
-- 
1.7.1


--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]