[libvirt] [PATCH v2 4/4] Check that QEMU is still alive while reading startup output.
Daniel P. Berrange
berrange at redhat.com
Wed May 6 08:58:34 UTC 2009
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 at 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 at 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 :|
More information about the libvir-list
mailing list