]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuDomainGetBlockJobInfo: Work stats for unfinished pre-blockdev blockjob
authorPeter Krempa <pkrempa@redhat.com>
Fri, 4 Dec 2020 15:08:02 +0000 (16:08 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 7 Dec 2020 09:15:00 +0000 (10:15 +0100)
If the job has finished, but we didn't yet process the completion fake
that it's still incomplete so that apps which decided to poll
qemuDomainGetBlockJobInfo rather than use events can be sure that the
XML update was completed.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_driver.c

index e2fde6c76fc21b3a6a54e30410995f23c9f23776..3051d2c7cae5b1efefb862f3861b4987a741c78b 100644 (file)
@@ -14642,6 +14642,15 @@ qemuBlockJobInfoTranslate(qemuMonitorBlockJobInfoPtr rawInfo,
                           virDomainDiskDefPtr disk,
                           bool reportBytes)
 {
+    /* If the job data is no longer present this means that the job already
+     * disappeared in qemu (pre-blockdev) but libvirt didn't process the
+     * finishing yet. Fake a incomplete job. */
+    if (!rawInfo) {
+        info->cur = 0;
+        info->end = 1;
+        return 0;
+    }
+
     info->cur = rawInfo->cur;
     info->end = rawInfo->end;
 
@@ -14727,10 +14736,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom,
     if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockjobstats)
         goto endjob;
 
-    if (!(rawInfo = g_hash_table_lookup(blockjobstats, job->name))) {
-        ret = 0;
-        goto endjob;
-    }
+    rawInfo = g_hash_table_lookup(blockjobstats, job->name);
 
     if (qemuBlockJobInfoTranslate(rawInfo, info, disk,
                                   flags & VIR_DOMAIN_BLOCK_JOB_INFO_BANDWIDTH_BYTES) < 0)