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 <benve@cisco.com>
This commit is contained in:
Christian Benvenuti 2012-03-27 13:00:01 -07:00 committed by Eric Blake
parent b0e2bb33d8
commit a02500d010
2 changed files with 19 additions and 4 deletions

View File

@ -227,6 +227,7 @@ Patches have also been contributed by:
Peng Zhou <ailvpeng25@gmail.com> Peng Zhou <ailvpeng25@gmail.com>
Li Zhang <zhlcindy@linux.vnet.ibm.com> Li Zhang <zhlcindy@linux.vnet.ibm.com>
Stef Walter <stefw@gnome.org> Stef Walter <stefw@gnome.org>
Christian Benvenuti <benve@cisco.com>
[....send patches to get your name here....] [....send patches to get your name here....]

View File

@ -2716,7 +2716,7 @@ qemuMigrationPerform(struct qemud_driver *driver,
} }
} }
static void static int
qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) { qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
int i; int i;
int last_good_net = -1; int last_good_net = -1;
@ -2731,13 +2731,19 @@ qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
virDomainNetGetActualDirectDev(net), virDomainNetGetActualDirectDev(net),
-1, -1,
def->uuid, 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; goto err_exit;
}
VIR_DEBUG("Port profile Associate succeeded for %s", net->ifname);
} }
last_good_net = i; last_good_net = i;
} }
return; return 0;
err_exit: err_exit:
for (i = 0; i < last_good_net; i++) { for (i = 0; i < last_good_net; i++) {
@ -2751,6 +2757,7 @@ err_exit:
VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH)); VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_FINISH));
} }
} }
return -1;
} }
@ -2805,7 +2812,14 @@ qemuMigrationFinish(struct qemud_driver *driver,
goto endjob; 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) { if (flags & VIR_MIGRATE_PERSIST_DEST) {
virDomainDefPtr vmdef; virDomainDefPtr vmdef;