]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Create wrapper for qemuMonitorMigrateCancel
authorJiri Denemark <jdenemar@redhat.com>
Tue, 30 Aug 2022 10:29:02 +0000 (12:29 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 6 Sep 2022 16:28:10 +0000 (18:28 +0200)
We will need a little bit more code around qemuMonitorMigrateCancel to
make sure it works as expected. The new qemuMigrationSrcCancel helper
will avoid repeating the code in several places.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_migration.h
src/qemu/qemu_process.c

index a3f8d8baf5c97a671d7255eb1e9558eece98e301..bb6607054e57a538fa84bef7079c95b46840456b 100644 (file)
@@ -12810,17 +12810,10 @@ qemuDomainGetJobStats(virDomainPtr dom,
 static int
 qemuDomainAbortJobMigration(virDomainObj *vm)
 {
-    qemuDomainObjPrivate *priv = vm->privateData;
-    int ret;
-
     VIR_DEBUG("Cancelling migration job at client request");
 
     qemuDomainObjAbortAsyncJob(vm);
-    qemuDomainObjEnterMonitor(vm);
-    ret = qemuMonitorMigrateCancel(priv->mon);
-    qemuDomainObjExitMonitor(vm);
-
-    return ret;
+    return qemuMigrationSrcCancel(vm, VIR_ASYNC_JOB_NONE);
 }
 
 
index b8c24833267d62d6f716d7fe0716017eaf2f4987..5c08e81c1ba8259432be1fe9b4473cf08512c079 100644 (file)
@@ -4611,6 +4611,32 @@ qemuMigrationSrcStart(virDomainObj *vm,
 }
 
 
+/**
+ * Requests outgoing migration to be canceled.
+ *
+ * The thread (the caller itself in most cases) which is watching the migration
+ * will do all the cleanup once migration is canceled. If no thread is watching
+ * the migration, use qemuMigrationSrcCancelUnattended instead.
+ */
+int
+qemuMigrationSrcCancel(virDomainObj *vm,
+                       virDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivate *priv = vm->privateData;
+    int rc;
+
+    VIR_DEBUG("Cancelling outgoing migration of domain %s", vm->def->name);
+
+    if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+        return -1;
+
+    rc = qemuMonitorMigrateCancel(priv->mon);
+    qemuDomainObjExitMonitor(vm);
+
+    return rc;
+}
+
+
 static int
 qemuMigrationSrcRun(virQEMUDriver *driver,
                     virDomainObj *vm,
@@ -4952,11 +4978,8 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
         }
 
         if (cancel &&
-            priv->job.current->status != VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED &&
-            qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_MIGRATION_OUT) == 0) {
-            qemuMonitorMigrateCancel(priv->mon);
-            qemuDomainObjExitMonitor(vm);
-        }
+            priv->job.current->status != VIR_DOMAIN_JOB_STATUS_HYPERVISOR_COMPLETED)
+            qemuMigrationSrcCancel(vm, VIR_ASYNC_JOB_MIGRATION_OUT);
 
         /* cancel any outstanding NBD jobs */
         if (mig && mig->nbd)
@@ -6900,11 +6923,8 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm,
         if (rc == -2) {
             virErrorPreserveLast(&orig_err);
             virCommandAbort(compressor);
-            if (virDomainObjIsActive(vm) &&
-                qemuDomainObjEnterMonitorAsync(vm, asyncJob) == 0) {
-                qemuMonitorMigrateCancel(priv->mon);
-                qemuDomainObjExitMonitor(vm);
-            }
+            if (virDomainObjIsActive(vm))
+                qemuMigrationSrcCancel(vm, asyncJob);
         }
         goto cleanup;
     }
@@ -6949,16 +6969,13 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm,
 int
 qemuMigrationSrcCancelUnattended(virDomainObj *vm)
 {
-    qemuDomainObjPrivate *priv = vm->privateData;
     bool storage = false;
     size_t i;
 
     VIR_DEBUG("Canceling unfinished outgoing migration of domain %s",
               vm->def->name);
 
-    qemuDomainObjEnterMonitor(vm);
-    ignore_value(qemuMonitorMigrateCancel(priv->mon));
-    qemuDomainObjExitMonitor(vm);
+    qemuMigrationSrcCancel(vm, VIR_ASYNC_JOB_NONE);
 
     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDef *disk = vm->def->disks[i];
index bbc71d118d9d802bc230175ce46466796b03a63e..31a55473990e611f48fad843f42b429030561a7b 100644 (file)
@@ -243,6 +243,10 @@ qemuMigrationSrcToFile(virQEMUDriver *driver,
 int
 qemuMigrationSrcCancelUnattended(virDomainObj *vm);
 
+int
+qemuMigrationSrcCancel(virDomainObj *vm,
+                       virDomainAsyncJob asyncJob);
+
 int
 qemuMigrationAnyFetchStats(virDomainObj *vm,
                            virDomainAsyncJob asyncJob,
index 4e8daf83fef54c13cb4e785ae1709b9eacfc8ecc..4465fa89e9cef148189e25fc9af320325469d4bb 100644 (file)
@@ -3674,7 +3674,6 @@ qemuProcessRecoverJob(virQEMUDriver *driver,
                       virDomainJobObj *job,
                       unsigned int *stopFlags)
 {
-    qemuDomainObjPrivate *priv = vm->privateData;
     virDomainState state;
     int reason;
 
@@ -3697,9 +3696,7 @@ qemuProcessRecoverJob(virQEMUDriver *driver,
     case VIR_ASYNC_JOB_SAVE:
     case VIR_ASYNC_JOB_DUMP:
     case VIR_ASYNC_JOB_SNAPSHOT:
-        qemuDomainObjEnterMonitor(vm);
-        ignore_value(qemuMonitorMigrateCancel(priv->mon));
-        qemuDomainObjExitMonitor(vm);
+        qemuMigrationSrcCancel(vm, VIR_ASYNC_JOB_NONE);
         /* resume the domain but only if it was paused as a result of
          * running a migration-to-file operation.  Although we are
          * recovering an async job, this function is run at startup