[libvirt PATCH 1/2] qemu: Always restore post-copy migration job on reconnect

Jiri Denemark jdenemar at redhat.com
Fri Nov 18 15:37:21 UTC 2022


We need the restored job even in case the migration already finished
even though we will stop it just a few lines below as the functions we
call in between require an existing migration job.

This fixes a crash on reconnect when post-copy migration finished while
the daemon was not running.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_process.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 0769f30d74..e1c18dde90 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3635,11 +3635,14 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
 
     if (rc > 0) {
         job->phase = QEMU_MIGRATION_PHASE_POSTCOPY_FAILED;
+        /* Even though we restore the migration async job here, the APIs below
+         * use VIR_ASYNC_JOB_NONE because we're already in a MODIFY job started
+         * before we reconnected to the domain. */
+        qemuProcessRestoreMigrationJob(vm, job);
 
         if (migStatus == VIR_DOMAIN_JOB_STATUS_POSTCOPY) {
             VIR_DEBUG("Post-copy migration of domain %s still running, it will be handled as unattended",
                       vm->def->name);
-            qemuProcessRestoreMigrationJob(vm, job);
             return 0;
         }
 
@@ -3648,17 +3651,19 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
                 qemuMigrationSrcPostcopyFailed(vm);
             else
                 qemuMigrationDstPostcopyFailed(vm);
-
-            qemuProcessRestoreMigrationJob(vm, job);
             return 0;
         }
 
         VIR_DEBUG("Post-copy migration of domain %s already finished",
                   vm->def->name);
-        if (job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT)
+        if (job->asyncJob == VIR_ASYNC_JOB_MIGRATION_OUT) {
             qemuMigrationSrcComplete(driver, vm, VIR_ASYNC_JOB_NONE);
-        else
+            /* No need to stop the restored job as the domain has just been
+             * destroyed. */
+        } else {
             qemuMigrationDstComplete(driver, vm, true, VIR_ASYNC_JOB_NONE, job);
+            virDomainObjEndAsyncJob(vm);
+        }
         return 0;
     }
 
-- 
2.38.1



More information about the libvir-list mailing list