[libvirt PATCH 27/30] qemu_process: abort snapshot delete when daemon starts

Pavel Hrdina phrdina at redhat.com
Thu Dec 8 13:31:03 UTC 2022


If the daemon crashes or is restarted while the snapshot delete is in
progress we have to handle it gracefully to not leave any block jobs
active.

For now we will simply abort the snapshot delete operation so user can
start it again.

Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
---
 src/qemu/qemu_process.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 5de55435d2..cc23b4a799 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3677,6 +3677,37 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
 }
 
 
+static void
+qemuProcessAbortSnapshotDelete(virDomainObj *vm)
+{
+    size_t i;
+    qemuDomainObjPrivate *priv = vm->privateData;
+
+    for (i = 0; i < vm->def->ndisks; i++) {
+        virDomainDiskDef *disk = vm->def->disks[i];
+        g_autoptr(qemuBlockJobData) diskJob = qemuBlockJobDiskGetJob(disk);
+
+        if (!diskJob)
+            continue;
+
+        if (diskJob->type != QEMU_BLOCKJOB_TYPE_COMMIT &&
+            diskJob->type != QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT) {
+            continue;
+        }
+
+        qemuBlockJobSyncBegin(diskJob);
+
+        qemuDomainObjEnterMonitor(vm);
+        ignore_value(qemuMonitorBlockJobCancel(priv->mon, diskJob->name, false));
+        qemuDomainObjExitMonitor(vm);
+
+        diskJob->state = QEMU_BLOCKJOB_STATE_ABORTING;
+
+        qemuBlockJobSyncEnd(vm, diskJob, VIR_ASYNC_JOB_NONE);
+    }
+}
+
+
 static int
 qemuProcessRecoverJob(virQEMUDriver *driver,
                       virDomainObj *vm,
@@ -3726,6 +3757,7 @@ qemuProcessRecoverJob(virQEMUDriver *driver,
                           vm->def->name);
             }
         }
+        qemuProcessAbortSnapshotDelete(vm);
         break;
 
     case VIR_ASYNC_JOB_START:
-- 
2.38.1



More information about the libvir-list mailing list