]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_snapshot: convert snapshot delete to async domain job
authorPavel Hrdina <phrdina@redhat.com>
Wed, 14 Dec 2022 18:09:48 +0000 (19:09 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Mon, 9 Jan 2023 12:33:02 +0000 (13:33 +0100)
Deleting external snapshots will require to run it as async domain job,
the same way as we do for snapshot creation.

For internal snapshots modify the job mask in order to forbid any other
job to be started.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_snapshot.c

index 30137a2b8f2e87392a97c5efb954d404a1c646ad..3fd348efd37530aa3212985e51926a4b42d3dd8c 100644 (file)
@@ -2359,10 +2359,15 @@ qemuSnapshotDiscard(virQEMUDriver *driver,
             if (qemuDomainSnapshotForEachQcow2(driver, def, snap, "-d", true) < 0)
                 return -1;
         } else {
-            qemuDomainObjEnterMonitor(vm);
+            /* Similarly as internal snapshot creation we would use a regular job
+             * here so set a mask to forbid any other job. */
+            qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_NONE);
+            if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0)
+                return -1;
             /* we continue on even in the face of error */
             qemuMonitorDeleteSnapshot(qemuDomainGetMonitor(vm), snap->def->name);
             qemuDomainObjExitMonitor(vm);
+            qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_DEFAULT_MASK);
         }
     }
 
@@ -2563,8 +2568,11 @@ qemuSnapshotDelete(virDomainObj *vm,
                   VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY |
                   VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY, -1);
 
-    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+    if (virDomainObjBeginAsyncJob(vm, VIR_ASYNC_JOB_SNAPSHOT,
+                                  VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_DELETE,
+                                  flags) < 0) {
         return -1;
+    }
 
     if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot)))
         goto endjob;
@@ -2583,7 +2591,7 @@ qemuSnapshotDelete(virDomainObj *vm,
     }
 
  endjob:
-    virDomainObjEndJob(vm);
+    virDomainObjEndAsyncJob(vm);
 
     return ret;
 }