]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemuDomainObjWait: Report error when VM is being destroyed
authorPeter Krempa <pkrempa@redhat.com>
Wed, 10 Aug 2022 13:39:57 +0000 (15:39 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 11 Aug 2022 12:34:25 +0000 (14:34 +0200)
Since we started handling the monitor EOF event inside a job any code
which uses virDomainObjWait would no longer properly abort in case when
the VM crashed during the wait.

This is because virDomainObjWait uses virDomainObjIsActive which checks
'vm->def->id' to see if the VM is still active. Unfortunately the domain
id is cleared in qemuProcessStop which is run only inside the job.

To fix this we can use the 'beingDestroyed' flag stored in the VM
private data which is set to true around the time when the condition is
signalled.

Reported-by: Pavel Hrdina <phrdina@redhat.com>
Fixes: 8c9ff9960b29d4703a99efdd1cadcf6f48799cc0
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_migration.c

index 2caed7315b6be1ddfb49a4f8c0e136bd6780133f..43b5ad5d6ec07aa7f281c84a1cdd8b8b726d0549 100644 (file)
@@ -11780,5 +11780,15 @@ qemuDomainRemoveLogs(virQEMUDriver *driver,
 int
 qemuDomainObjWait(virDomainObj *vm)
 {
-    return virDomainObjWait(vm);
+    qemuDomainObjPrivate *priv = vm->privateData;
+
+    if (virDomainObjWait(vm) < 0)
+        return -1;
+
+    if (priv->beingDestroyed) {
+        virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("domain is not running"));
+        return -1;
+    }
+
+    return 0;
 }
index 0b48852b9d3ed572f344c00022cabbb5ecd2942c..8a8e9ab207c80211b7c561daeb194e5a9787006f 100644 (file)
@@ -2078,7 +2078,7 @@ qemuMigrationSrcWaitForCompletion(virDomainObj *vm,
             return rv;
 
         if (qemuDomainObjWait(vm) < 0) {
-            if (virDomainObjIsActive(vm))
+            if (virDomainObjIsActive(vm) && !priv->beingDestroyed)
                 jobData->status = VIR_DOMAIN_JOB_STATUS_FAILED;
             return -2;
         }