]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_monitor: introduce qemuMonitorJobFinalize
authorPavel Hrdina <phrdina@redhat.com>
Tue, 21 Jun 2022 13:22:15 +0000 (15:22 +0200)
committerPavel Hrdina <phrdina@redhat.com>
Mon, 9 Jan 2023 12:32:43 +0000 (13:32 +0100)
Upcoming snapshot deletion code will require that multiple commit jobs
are finished in sync. To allow aborting then if one fails we will need
to use manual finalization of the jobs.

This commit implements the monitor code for `job-finalize`.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
tests/qemumonitorjsontest.c

index 6303200d1e2a26e145379069f9abec0738d8d365..771b1b6d598827b6588d1a50b280c3031a2298cd 100644 (file)
@@ -2932,6 +2932,18 @@ qemuMonitorJobDismiss(qemuMonitor *mon,
 }
 
 
+int
+qemuMonitorJobFinalize(qemuMonitor *mon,
+                       const char *jobname)
+{
+    VIR_DEBUG("jobname=%s", jobname);
+
+    QEMU_CHECK_MONITOR(mon);
+
+    return qemuMonitorJSONJobFinalize(mon, jobname);
+}
+
+
 int
 qemuMonitorJobComplete(qemuMonitor *mon,
                        const char *jobname)
index 324eee5a89d97b92f28d6b6d1f640da0ad038873..f51146a13a5a4c8aed674e0990624bf52a653dbe 100644 (file)
@@ -1029,6 +1029,11 @@ int qemuMonitorJobDismiss(qemuMonitor *mon,
                           const char *jobname)
     ATTRIBUTE_NONNULL(2);
 
+int
+qemuMonitorJobFinalize(qemuMonitor *mon,
+                       const char *jobname)
+    ATTRIBUTE_NONNULL(2);
+
 int qemuMonitorJobComplete(qemuMonitor *mon,
                            const char *jobname)
     ATTRIBUTE_NONNULL(2);
index 3b96f4e03783f8e116fa01f945e867a449e91e14..4495f8f2cfbefc17f359c2fa326b55aff11484cb 100644 (file)
@@ -4405,6 +4405,28 @@ qemuMonitorJSONJobDismiss(qemuMonitor *mon,
 }
 
 
+int
+qemuMonitorJSONJobFinalize(qemuMonitor *mon,
+                           const char *jobname)
+{
+    g_autoptr(virJSONValue) cmd = NULL;
+    g_autoptr(virJSONValue) reply = NULL;
+
+    if (!(cmd = qemuMonitorJSONMakeCommand("job-finalize",
+                                           "s:id", jobname,
+                                           NULL)))
+        return -1;
+
+    if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
+        return -1;
+
+    if (qemuMonitorJSONBlockJobError(cmd, reply, jobname) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 int
 qemuMonitorJSONJobComplete(qemuMonitor *mon,
                            const char *jobname)
index a86f054b8bdf76e8d84bc524ccc74cf8d326c45e..d774cbaf147f7e48fe0f4b2d0d89ac0f41c5b4e9 100644 (file)
@@ -377,6 +377,11 @@ qemuMonitorJSONJobDismiss(qemuMonitor *mon,
                           const char *jobname)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+int
+qemuMonitorJSONJobFinalize(qemuMonitor *mon,
+                           const char *jobname)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
 int
 qemuMonitorJSONJobComplete(qemuMonitor *mon,
                            const char *jobname)
index 59f73227113afe55ddfdf73ed945b095ac9ba87e..f224ccb36463d58743c85884dfe6a3534e6e7bf3 100644 (file)
@@ -1223,6 +1223,7 @@ GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumInsert, "foodev", "newnode")
 GEN_TEST_FUNC(qemuMonitorJSONBitmapRemove, "foodev", "newnode")
 GEN_TEST_FUNC(qemuMonitorJSONJobDismiss, "jobname")
 GEN_TEST_FUNC(qemuMonitorJSONJobComplete, "jobname")
+GEN_TEST_FUNC(qemuMonitorJSONJobFinalize, "jobname")
 GEN_TEST_FUNC(qemuMonitorJSONBlockJobCancel, "jobname", true)
 GEN_TEST_FUNC(qemuMonitorJSONSetAction,
               QEMU_MONITOR_ACTION_SHUTDOWN_PAUSE,
@@ -2921,6 +2922,7 @@ mymain(void)
     DO_TEST_GEN(qemuMonitorJSONBitmapRemove);
     DO_TEST_GEN(qemuMonitorJSONJobDismiss);
     DO_TEST_GEN(qemuMonitorJSONJobComplete);
+    DO_TEST_GEN(qemuMonitorJSONJobFinalize);
     DO_TEST_GEN(qemuMonitorJSONBlockJobCancel);
     DO_TEST_GEN(qemuMonitorJSONSetAction);
     DO_TEST_GEN(qemuMonitorJSONSetLaunchSecurityState);