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
---
src/libvirt.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/libvirt.c b/src/libvirt.c
index 8c3d586..0f19bde 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -3481,6 +3481,7 @@ virDomainMigrateVersion2 (virDomainPtr domain,
int cookielen = 0, ret;
virDomainInfo info;
virErrorPtr orig_err = NULL;
+ int cancelled;
/* Prepare the migration.
*
@@ -3526,7 +3527,8 @@ virDomainMigrateVersion2 (virDomainPtr domain,
virLibConnError(VIR_ERR_INTERNAL_ERROR,
_("domainMigratePrepare2 did not set uri"));
virDispatchError(domain->conn);
- goto done;
+ cancelled = 1;
+ goto finish;
}
if (uri_out)
uri = uri_out; /* Did domainMigratePrepare2 change URI? */
@@ -3542,6 +3544,12 @@ virDomainMigrateVersion2 (virDomainPtr domain,
if (ret < 0)
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
* status code from the sender to the destination host,
* so it can do any cleanup if the migration failed.
@@ -3549,7 +3557,7 @@ virDomainMigrateVersion2 (virDomainPtr domain,
dname = dname ? dname : domain->name;
VIR_DEBUG("Finish2 %p ret=%d", dconn, ret);
ddomain = dconn->driver->domainMigrateFinish2
- (dconn, dname, cookie, cookielen, uri, flags, ret);
+ (dconn, dname, cookie, cookielen, uri, flags, cancelled);
done:
if (orig_err) {
@@ -3644,7 +3652,8 @@ virDomainMigrateVersion3(virDomainPtr domain,
virLibConnError(VIR_ERR_INTERNAL_ERROR,
_("domainMigratePrepare3 did not set uri"));
virDispatchError(domain->conn);
- goto done;
+ cancelled = 1;
+ goto finish;
}
if (uri_out)
uri = uri_out; /* Did domainMigratePrepare3 change URI? */
@@ -3673,6 +3682,7 @@ virDomainMigrateVersion3(virDomainPtr domain,
*/
cancelled = ret < 0 ? 1 : 0;
+finish:
/*
* The status code from the source is passed to the destination.
* The dest can cleanup if the source indicated it failed to
--
1.7.4.4