[libvirt] [PATCH 6/7] Check that QEMU is still alive while reading startup output.

Cole Robinson crobinso at redhat.com
Tue Apr 28 15:31:56 UTC 2009


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).
---
 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 2f17f6c..04df8ae 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.2.2




More information about the libvir-list mailing list