1
0

Fix VM teardown if prepare returns invalid URI in v2 migration

The v2 migration protocol was accidentally missing out the
finish step, when prepare succeeded, but returned an invalid
URI

* src/libvirt.c: Teardown VM if prepare returns invalid URI
This commit is contained in:
Daniel P. Berrange 2011-04-20 13:48:11 +01:00
parent 13cb49f847
commit 6b0fa703a8

View File

@ -3597,6 +3597,7 @@ virDomainMigrateVersion2 (virDomainPtr domain,
int cookielen = 0, ret; int cookielen = 0, ret;
virDomainInfo info; virDomainInfo info;
virErrorPtr orig_err = NULL; virErrorPtr orig_err = NULL;
int cancelled;
/* Prepare the migration. /* Prepare the migration.
* *
@ -3642,7 +3643,8 @@ virDomainMigrateVersion2 (virDomainPtr domain,
virLibConnError(VIR_ERR_INTERNAL_ERROR, virLibConnError(VIR_ERR_INTERNAL_ERROR,
_("domainMigratePrepare2 did not set uri")); _("domainMigratePrepare2 did not set uri"));
virDispatchError(domain->conn); virDispatchError(domain->conn);
goto done; cancelled = 1;
goto finish;
} }
if (uri_out) if (uri_out)
uri = uri_out; /* Did domainMigratePrepare2 change URI? */ uri = uri_out; /* Did domainMigratePrepare2 change URI? */
@ -3658,6 +3660,12 @@ virDomainMigrateVersion2 (virDomainPtr domain,
if (ret < 0) if (ret < 0)
orig_err = virSaveLastError(); orig_err = virSaveLastError();
/* If Perform returns < 0, then we need to cancel the VM
* startup on the destination
*/
cancelled = ret < 0 ? 1 : 0;
finish:
/* In version 2 of the migration protocol, we pass the /* In version 2 of the migration protocol, we pass the
* status code from the sender to the destination host, * status code from the sender to the destination host,
* so it can do any cleanup if the migration failed. * so it can do any cleanup if the migration failed.
@ -3665,7 +3673,7 @@ virDomainMigrateVersion2 (virDomainPtr domain,
dname = dname ? dname : domain->name; dname = dname ? dname : domain->name;
VIR_DEBUG("Finish2 %p ret=%d", dconn, ret); VIR_DEBUG("Finish2 %p ret=%d", dconn, ret);
ddomain = dconn->driver->domainMigrateFinish2 ddomain = dconn->driver->domainMigrateFinish2
(dconn, dname, cookie, cookielen, uri, flags, ret); (dconn, dname, cookie, cookielen, uri, flags, cancelled);
done: done:
if (orig_err) { if (orig_err) {
@ -3760,7 +3768,8 @@ virDomainMigrateVersion3(virDomainPtr domain,
virLibConnError(VIR_ERR_INTERNAL_ERROR, virLibConnError(VIR_ERR_INTERNAL_ERROR,
_("domainMigratePrepare3 did not set uri")); _("domainMigratePrepare3 did not set uri"));
virDispatchError(domain->conn); virDispatchError(domain->conn);
goto done; cancelled = 1;
goto finish;
} }
if (uri_out) if (uri_out)
uri = uri_out; /* Did domainMigratePrepare3 change URI? */ uri = uri_out; /* Did domainMigratePrepare3 change URI? */
@ -3789,6 +3798,7 @@ virDomainMigrateVersion3(virDomainPtr domain,
*/ */
cancelled = ret < 0 ? 1 : 0; cancelled = ret < 0 ? 1 : 0;
finish:
/* /*
* The status code from the source is passed to the destination. * The status code from the source is passed to the destination.
* The dest can cleanup if the source indicated it failed to * The dest can cleanup if the source indicated it failed to