[libvirt] [PATCH 2/3] Don't kill QEMU process when a monitor I/O parsing error occurs

Jiri Denemark jdenemar at redhat.com
Thu May 26 11:50:46 UTC 2011


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




More information about the libvir-list mailing list