From 0c8a9d2d514516b45515fc79417a7c869ccc83d8 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Mon, 11 May 2009 13:52:31 +0000 Subject: [PATCH] Check that QEMU is still alive while reading startup output. 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). --- ChangeLog | 5 +++++ src/qemu_driver.c | 33 ++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index d43ea5fd61..3157b92e3e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon May 11 09:51:00 EDT 2009 Cole Robinson + + * src/qemu_driver.c : Check that QEMU is still alive while + reading startup output. + Mon May 11 09:44:40 EDT 2009 Cole Robinson * src/util.[ch] : Add pidfile argument to __virExec diff --git a/src/qemu_driver.c b/src/qemu_driver.c index 61a7cf1d47..30642d5009 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;