]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Be more forgiving when acquiring QUERY job when formatting domain XML
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 16 Jun 2025 08:28:37 +0000 (10:28 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 18 Jun 2025 08:41:33 +0000 (10:41 +0200)
In my previous commit of v11.0.0-rc1~115 I've made QEMU driver
implementation for virDomainGetXMLDesc() (qemuDomainGetXMLDesc())
acquire QERY job. See its commit message for more info. But this
unfortunately broke apps witch fetch domain XML for incoming
migration (like virt-manager). The reason is that for incoming
migration the VIR_ASYNC_JOB_MIGRATION_IN async job is set, but
the mask of allowed synchronous jobs is empty (because QEMU can't
talk on monitor really). This makes virDomainObjBeginJob() fail
which in turn makes qemuDomainGetXMLDesc() fail too.

It makes sense for qemuDomainGetXMLDesc() to acquire the job
(e.g. so that it's coherent with another thread that might be in
the middle of a MODIFY job). But failure to dump XML may be
treated as broken daemon (e.g. virt-manager does so).

Therefore, still try to acquire the QUERY job (if job mask
permits it) but, do not treat failure as an error.

Fixes: 6cc93bf28842526be2fd596a607ebca796b7fb2e
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2369243
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_driver.c

index b3b0ee66f8e976bc0d6d342525c265a531b0d994..9b583ad7aa48458a0365ddadf56255ba18bc4b66 100644 (file)
@@ -6182,6 +6182,7 @@ static char
 {
     virQEMUDriver *driver = dom->conn->privateData;
     virDomainObj *vm;
+    bool hasJob = false;
     char *ret = NULL;
 
     virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS | VIR_DOMAIN_XML_UPDATE_CPU,
@@ -6193,8 +6194,10 @@ static char
     if (virDomainGetXMLDescEnsureACL(dom->conn, vm->def, flags) < 0)
         goto cleanup;
 
-    if (virDomainObjBeginJob(vm, VIR_JOB_QUERY) < 0)
-        goto cleanup;
+    if (virDomainNestedJobAllowed(vm->job, VIR_JOB_QUERY) &&
+        virDomainObjBeginJob(vm, VIR_JOB_QUERY) >= 0) {
+        hasJob = true;
+    }
 
     qemuDomainUpdateCurrentMemorySize(vm);
 
@@ -6210,7 +6213,8 @@ static char
 
     ret = qemuDomainFormatXML(driver, vm, flags);
 
-    virDomainObjEndJob(vm);
+    if (hasJob)
+        virDomainObjEndJob(vm);
 
  cleanup:
     virDomainObjEndAPI(&vm);