[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 3/5] libxl: fix job handling across migration phases on src



The libxlDomainMigrationSrc* functions are a bit flawed in their
handling of modify jobs. A job begins at the start of the begin
phase but ends before the phase completes. No job is running for
the remaining phases of migration on the source host.

Change the logic to keep the job running after a successful begin
phase, and end the job in the confirm phase. The job must also end
in the perform phase in the case of error since confirm phase would
not be executed.

Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx>
---
 src/libxl/libxl_migration.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c
index e4f2895690..191973edeb 100644
--- a/src/libxl/libxl_migration.c
+++ b/src/libxl/libxl_migration.c
@@ -399,6 +399,11 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn,
     virDomainDefPtr def;
     char *xml = NULL;
 
+    /*
+     * In the case of successful migration, a job is started here and
+     * terminated in the confirm phase. Errors in the begin or perform
+     * phase will also terminate the job.
+     */
     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
         goto cleanup;
 
@@ -428,6 +433,9 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn,
         goto endjob;
 
     xml = virDomainDefFormat(def, cfg->caps, VIR_DOMAIN_DEF_FORMAT_SECURE);
+    /* Valid xml means success! EndJob in the confirm phase */
+    if (xml)
+        goto cleanup;
 
  endjob:
     libxlDomainObjEndJob(driver, vm);
@@ -1169,6 +1177,14 @@ libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr 
driver,
     ret = libxlDoMigrateSrcP2P(driver, vm, sconn, xmlin, dconn, dconnuri,
                                dname, uri_str, flags);
 
+    if (ret < 0) {
+        /*
+         * Confirm phase will not be executed if perform fails. End the
+         * job started in begin phase.
+         */
+        libxlDomainObjEndJob(driver, vm);
+    }
+
  cleanup:
     orig_err = virSaveLastError();
     virObjectUnlock(vm);
@@ -1232,11 +1248,17 @@ libxlDomainMigrationSrcPerform(libxlDriverPrivatePtr 
driver,
     ret = libxlDoMigrateSrcSend(driver, vm, flags, sockfd);
     virObjectLock(vm);
 
-    if (ret < 0)
+    if (ret < 0) {
         virDomainLockProcessResume(driver->lockManager,
                                    "xen:///system",
                                    vm,
                                    priv->lockState);
+        /*
+         * Confirm phase will not be executed if perform fails. End the
+         * job started in begin phase.
+         */
+        libxlDomainObjEndJob(driver, vm);
+    }
 
  cleanup:
     VIR_FORCE_CLOSE(sockfd);
@@ -1386,6 +1408,8 @@ libxlDomainMigrationSrcConfirm(libxlDriverPrivatePtr 
driver,
     ret = 0;
 
  cleanup:
+    /* EndJob for corresponding BeginJob in begin phase */
+    libxlDomainObjEndJob(driver, vm);
     virObjectEventStateQueue(driver->domainEventState, event);
     virObjectUnref(cfg);
     return ret;
-- 
2.18.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.