]> xenbits.xensource.com Git - libvirt.git/commitdiff
Check that QEMU is still alive while reading startup output.
authorCole Robinson <crobinso@redhat.com>
Mon, 11 May 2009 13:52:31 +0000 (13:52 +0000)
committerCole Robinson <crobinso@redhat.com>
Mon, 11 May 2009 13:52:31 +0000 (13:52 +0000)
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
src/qemu_driver.c

index d43ea5fd61cfb0ceba4f27a25f5352a6de5aa8ef..3157b92e3e49fd4c85c1798e30b121bdb2ba38a5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 11 09:51:00 EDT 2009 Cole Robinson <crobinso@redhat.com>
+
+       * src/qemu_driver.c : Check that QEMU is still alive while
+       reading startup output.
+
 Mon May 11 09:44:40 EDT 2009 Cole Robinson <crobinso@redhat.com>
 
        * src/util.[ch] : Add pidfile argument to __virExec
index 61a7cf1d470472e7fe4160b02917c7c3a6cfa990..30642d50092681b1be60275c37ba3963a30aed83 100644 (file)
@@ -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;