[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v2 4/4] Check that QEMU is still alive while reading startup output.



On Mon, May 04, 2009 at 03:52:11PM -0400, Cole Robinson wrote:
> By checking the pid every retry period, we can quickly determine if
> the process crashed at startup, rather than make the user wait for
> the entire timeout (3 seconds).


ACK.

Daniel

> 
> Signed-off-by: Cole Robinson <crobinso redhat com>
> ---
>  src/qemu_driver.c |   33 ++++++++++++++++++++++-----------
>  1 files changed, 22 insertions(+), 11 deletions(-)
> 
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index fb4ad64..5c8a883 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -744,29 +744,40 @@ qemudReadLogOutput(virConnectPtr conn,
>                     int timeout)
>  {
>      int retries = timeout*10;
> +    int got = 0;
>      buf[0] = '\0';
>  
>      while (retries) {
>          ssize_t ret;
> -        size_t got = 0;
> +        int isdead = 0;
>  
> -        while((ret = read(fd, buf+got, buflen-got-1)) > 0) {
> -            got += ret;
> -            buf[got] = '\0';
> -            if ((buflen-got-1) == 0) {
> -                qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> -                                 _("Out of space while reading %s log output"), what);
> -                return -1;
> -            }
> -        }
> +        if (kill(vm->pid, 0) == -1 && errno == ESRCH)
> +            isdead = 1;
>  
> -        if (ret < 0 && errno != EINTR) {
> +        ret = saferead(fd, buf+got, buflen-got-1);
> +        if (ret < 0) {
>              virReportSystemError(conn, errno,
>                                   _("Failure while reading %s log output"),
>                                   what);
>              return -1;
>          }
>  
> +        got += ret;
> +        buf[got] = '\0';
> +        if (got == buflen-1) {
> +            qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                             _("Out of space while reading %s log output"),
> +                             what);
> +            return -1;
> +        }
> +
> +        if (isdead) {
> +            qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                             _("Process exited while reading %s log output"),
> +                             what);
> +            return -1;
> +        }
> +
>          ret = func(conn, vm, buf, fd);
>          if (ret <= 0)
>              return ret;
> -- 
> 1.6.0.6
> 
> --
> Libvir-list mailing list
> Libvir-list redhat com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]