From a02500d010f635a6f5ffe63556d66f3a38139a51 Mon Sep 17 00:00:00 2001 From: Christian Benvenuti Date: Tue, 27 Mar 2012 13:00:01 -0700 Subject: [PATCH] qemu: Make migration fail when port profile association fails on the dst host 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 --- AUTHORS | 1 + src/qemu/qemu_migration.c | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index 881a8c1552..33154400a2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -227,6 +227,7 @@ Patches have also been contributed by: Peng Zhou Li Zhang Stef Walter + Christian Benvenuti [....send patches to get your name here....] diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 802785f341..49a260de2f 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,19 @@ 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) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + _("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 +2757,7 @@ err_exit: VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH)); } } + return -1; } @@ -2805,7 +2812,14 @@ 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;