
On Wed, Jan 19, 2011 at 08:19:36PM +0100, Jiri Denemark wrote:
In some circumstances, libvirtd would issue two STOPPED events after it stopped a domain. This was because an EOF event can arrive after a qemu process is killed but before qemuMonitorClose() is called.
qemuHandleMonitorEOF() should ignore EOF when the domain is not running.
I wasn't able to reproduce this bug directly, only after adding an artificial sleep() into qemudShutdownVMDaemon().
That sounds reasonable - it would definitely be a race condition if it occurred, so sleep() would be expected to trigger it more often.
--- src/qemu/qemu_driver.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 22dc272..cff7a43 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -356,6 +356,12 @@ qemuHandleMonitorEOF(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virDomainObjLock(vm);
+ if (!virDomainObjIsActive(vm)) { + VIR_DEBUG("Domain %p is not active, ignoring EOF", vm); + virDomainObjUnlock(vm); + return; + } + priv = vm->privateData; if (!hasError && priv->monJSON && !priv->gotShutdown) { VIR_DEBUG("Monitor connection to '%s' closed without SHUTDOWN event; "
ACK Daniel