File 47da84e0-libxl-fix-job-handling-migsrc.patch of Package libvirt.11329

commit 47da84e09044e5af914a64469d06adef34279964
Author: Jim Fehlig <jfehlig@suse.com>
Date:   Tue Aug 28 17:30:18 2018 -0600

    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@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
@@ -400,6 +400,11 @@ libxlDomainMigrationBegin(virConnectPtr
     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;
 
@@ -429,6 +434,9 @@ libxlDomainMigrationBegin(virConnectPtr
         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);
@@ -1177,6 +1185,14 @@ libxlDomainMigrationPerformP2P(libxlDriv
     ret = libxlDoMigrateP2P(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);
@@ -1240,11 +1256,17 @@ libxlDomainMigrationPerform(libxlDriverP
     ret = libxlDoMigrateSend(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);
@@ -1405,6 +1427,8 @@ libxlDomainMigrationConfirm(libxlDriverP
     ret = 0;
 
  cleanup:
+    /* EndJob for corresponding BeginJob in begin phase */
+    libxlDomainObjEndJob(driver, vm);
     if (event)
         libxlDomainEventQueue(driver, event);
     virObjectUnref(cfg);
openSUSE Build Service is sponsored by