[libvirt] [PATCH] Fix handling of VIR_EVENT_HANDLE_ERROR in QEMU monitor

Daniel Veillard veillard at redhat.com
Thu Jun 2 12:59:18 UTC 2011


On Thu, Jun 02, 2011 at 11:52:10AM +0100, Daniel P. Berrange wrote:
> Commit 4454a9efc728b91e791b1f14c26ea23a19d57f48 introduced bad
> behaviour on the VIR_EVENT_HANDLE_ERROR condition. This condition
> is only hit when an invalid FD is used in poll() (typically due
> to a double-close bug). The QEMU monitor code was treating this
> condition as non-fatal, and thus libvirt would poll() in a fast
> loop forever burning 100% CPU. VIR_EVENT_HANDLE_ERROR must be
> handled in the same way as VIR_EVENT_HANDLE_HANGUP, killing the
> QEMU instance.
> 
> * src/qemu/qemu_monitor.c: Treat VIR_EVENT_HANDLE_ERROR as EOF
> ---
>  src/qemu/qemu_monitor.c |    9 +++++----
>  1 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 09a1b8e..26bb814 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -535,14 +535,14 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
>  #endif
>  
>      if (mon->fd != fd || mon->watch != watch) {
> -        if (events & VIR_EVENT_HANDLE_HANGUP)
> +        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
>              eof = true;
>          qemuReportError(VIR_ERR_INTERNAL_ERROR,
>                          _("event from unexpected fd %d!=%d / watch %d!=%d"),
>                          mon->fd, fd, mon->watch, watch);
>          error = true;
>      } else if (mon->lastError.code != VIR_ERR_OK) {
> -        if (events & VIR_EVENT_HANDLE_HANGUP)
> +        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
>              eof = true;
>          error = true;
>      } else {
> @@ -581,8 +581,9 @@ qemuMonitorIO(int watch, int fd, int events, void *opaque) {
>          if (!error && !eof &&
>              events & VIR_EVENT_HANDLE_ERROR) {
>              qemuReportError(VIR_ERR_INTERNAL_ERROR,
> -                            _("Error while waiting for monitor"));
> -            error = 1;
> +                            _("Invalid file descriptor while waiting for monitor"));
> +            eof = 1;
> +            events &= ~VIR_EVENT_HANDLE_ERROR;
>          }
>          if (!error && events) {
>              qemuReportError(VIR_ERR_INTERNAL_ERROR,

  Hum, that serious ! ACK

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list