From: Michal Privoznik Date: Mon, 16 Jun 2025 08:28:37 +0000 (+0200) Subject: qemu: Be more forgiving when acquiring QUERY job when formatting domain XML X-Git-Tag: v11.5.0-rc1~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=441c23a7e626c13e6df1946303a0bc0a84180d1c;p=thirdparty%2Flibvirt.git qemu: Be more forgiving when acquiring QUERY job when formatting domain XML 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 Reviewed-by: Pavel Hrdina --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3b0ee66f8..9b583ad7aa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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);