File e39c66d3-libxl-fix-p2p-migration.patch of Package libvirt.11701
commit e39c66d3ce3e65170a1db1324eb1fb8e57d82ecb
Author: Jim Fehlig <jfehlig@suse.com>
Date: Tue Aug 28 17:13:54 2018 -0600
libxl: fix logic in P2P migration
libxlDoMigrateSrcP2P() performs all phases of the migration
protocol for peer-to-peer migration. Unfortunately the logic
was a bit flawed since it is possible to skip the confirm
phase after a successfull begin and prepare phase. Fix the
logic to always call the confirm phase after a successful begin
and perform. Skip the confirm phase if begin or perform fail.
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
Index: libvirt-4.0.0/src/libxl/libxl_migration.c
===================================================================
--- libvirt-4.0.0.orig/src/libxl/libxl_migration.c
+++ libvirt-4.0.0/src/libxl/libxl_migration.c
@@ -980,21 +980,13 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
char *cookieout = NULL;
int cookieoutlen;
bool cancelled = true;
+ bool notify_source = true;
virErrorPtr orig_err = NULL;
int ret = -1;
/* For tunnel migration */
virStreamPtr st = NULL;
struct libxlTunnelControl *tc = NULL;
- dom_xml = libxlDomainMigrationBegin(sconn, vm, xmlin,
- &cookieout, &cookieoutlen);
- if (!dom_xml)
- goto cleanup;
-
- if (virTypedParamsAddString(¶ms, &nparams, &maxparams,
- VIR_MIGRATE_PARAM_DEST_XML, dom_xml) < 0)
- goto cleanup;
-
if (dname &&
virTypedParamsAddString(¶ms, &nparams, &maxparams,
VIR_MIGRATE_PARAM_DEST_NAME, dname) < 0)
@@ -1005,6 +997,19 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
VIR_MIGRATE_PARAM_URI, uri) < 0)
goto cleanup;
+ dom_xml = libxlDomainMigrationBegin(sconn, vm, xmlin,
+ &cookieout, &cookieoutlen);
+ /*
+ * If dom_xml is non-NULL the begin phase has succeeded, and the
+ * confirm phase must be called to cleanup the migration operation.
+ */
+ if (!dom_xml)
+ goto cleanup;
+
+ if (virTypedParamsAddString(¶ms, &nparams, &maxparams,
+ VIR_MIGRATE_PARAM_DEST_XML, dom_xml) < 0)
+ goto confirm;
+
/* We don't require the destination to have P2P support
* as it looks to be normal migration from the receiver perpective.
*/
@@ -1014,7 +1019,7 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
virObjectUnlock(vm);
if (flags & VIR_MIGRATE_TUNNELLED) {
if (!(st = virStreamNew(dconn, 0)))
- goto cleanup;
+ goto confirm;
ret = dconn->driver->domainMigratePrepareTunnel3Params
(dconn, st, params, nparams, cookieout, cookieoutlen, NULL, NULL, destflags);
} else {
@@ -1024,7 +1029,7 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
virObjectLock(vm);
if (ret == -1)
- goto cleanup;
+ goto confirm;
if (!(flags & VIR_MIGRATE_TUNNELLED)) {
if (uri_out) {
@@ -1046,8 +1051,10 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
else
ret = libxlDomainMigrationPerform(driver, vm, NULL, NULL,
uri_out, NULL, flags);
- if (ret < 0)
+ if (ret < 0) {
+ notify_source = false;
orig_err = virSaveLastError();
+ }
cancelled = (ret < 0);
@@ -1075,12 +1082,15 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
if (!orig_err)
orig_err = virSaveLastError();
- VIR_DEBUG("Confirm3 cancelled=%d vm=%p", cancelled, vm);
- ret = libxlDomainMigrationConfirm(driver, vm, flags, cancelled);
-
- if (ret < 0)
- VIR_WARN("Guest %s probably left in 'paused' state on source",
- vm->def->name);
+ confirm:
+ if (notify_source) {
+ VIR_DEBUG("Confirm3 cancelled=%d vm=%p", cancelled, vm);
+ ret = libxlDomainMigrationConfirm(driver, vm, flags, cancelled);
+
+ if (ret < 0)
+ VIR_WARN("Guest %s probably left in 'paused' state on source",
+ vm->def->name);
+ }
cleanup:
if (flags & VIR_MIGRATE_TUNNELLED) {