On Tue, May 24, 2011 at 18:06:42 +0100, Daniel P. Berrange wrote: > Currently whenever there is any failure with parsing the monitor, > this is treated in the same was as end-of-file (ie QEMU quit). > The domain is terminated, if not already dead. > > With this change, failures in parsing the monitor stream do not > result in the death of QEMU. The guest continues running unchanged, > but all further use of the monitor will be disabled. > > The VMM_FAILURE event will be emitted, and the mgmt application > can decide when to kill/restart the guest to re-gain control > > * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Run a > different callback for monitor EOF vs error conditions. > * src/qemu/qemu_process.c: Emit VMM_FAILURE event when monitor > fails > --- > src/qemu/qemu_monitor.c | 45 +++++++++++++++++++++++++---------------- > src/qemu/qemu_monitor.h | 7 +++-- > src/qemu/qemu_process.c | 50 ++++++++++++++++++++++++++++++++++------------ > 3 files changed, 68 insertions(+), 34 deletions(-) ... > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index 01b15e0..4eca63b 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -100,12 +100,13 @@ extern struct qemud_driver *qemu_driver; > */ > static void > qemuProcessHandleMonitorEOF(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > - virDomainObjPtr vm, > - int hasError) > + virDomainObjPtr vm) > { > struct qemud_driver *driver = qemu_driver; > virDomainEventPtr event = NULL; > qemuDomainObjPrivatePtr priv; > + int eventReason = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN; > + const char *auditReason = "shutdown"; > > VIR_DEBUG("Received EOF on %p '%s'", vm, vm->def->name); > > @@ -120,32 +121,54 @@ qemuProcessHandleMonitorEOF(qemuMonitorPtr mon ATTRIBUTE_UNUSED, > } > > priv = vm->privateData; > - if (!hasError && priv->monJSON && !priv->gotShutdown) { > + if (priv->monJSON && !priv->gotShutdown) { > VIR_DEBUG("Monitor connection to '%s' closed without SHUTDOWN event; " > "assuming the domain crashed", vm->def->name); > - hasError = 1; > + eventReason = VIR_DOMAIN_EVENT_STOPPED_FAILED; > + auditReason = "failed"; > } > > event = virDomainEventNewFromObj(vm, > - VIR_DOMAIN_EVENT_STOPPED, > - hasError ? > - VIR_DOMAIN_EVENT_STOPPED_FAILED : > - VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > + VIR_DOMAIN_EVENT_STOPPED, eventReason); > > qemuProcessStop(driver, vm, 0, > - hasError ? > - VIR_DOMAIN_SHUTOFF_CRASHED : > VIR_DOMAIN_SHUTOFF_SHUTDOWN); I don't think this change is correct. Wee need to correct reason to be passed to qemuProcessStop so that virDomainGetState can report it. This way we would always report normal shutdown. Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list