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
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list