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

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

 



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

--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]