]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Speed up fallback to legacy non-QMP probing
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 7 Jan 2013 16:19:36 +0000 (16:19 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 7 Jan 2013 18:13:54 +0000 (18:13 +0000)
Since we daemonized QEMU for capabilities probing there is a long
time if QEMU fails to launch. This is because we're not passing in
any virDomainObjPtr instance and thus the monitor code can not
check to see if the PID is still alive.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/qemu/qemu_capabilities.c

index e16bc707615d36384a702334bb0437d676f54041..bcecc6d04cf7a5ec3e3617c26cc795cb51ee54e5 100644 (file)
@@ -2307,6 +2307,8 @@ qemuCapsInitQMP(qemuCapsPtr caps,
     char *pidfile = NULL;
     qemuCapsHookData hookData;
     char *archstr;
+    pid_t pid = 0;
+    virDomainObj vm;
 
     /* the ".sock" sufix is important to avoid a possible clash with a qemu
      * domain called "capabilities"
@@ -2360,7 +2362,16 @@ qemuCapsInitQMP(qemuCapsPtr caps,
         goto cleanup;
     }
 
-    if (!(mon = qemuMonitorOpen(NULL, &config, true, &callbacks))) {
+    if (virPidFileReadPath(pidfile, &pid) < 0) {
+        VIR_DEBUG("Failed to read pidfile %s", pidfile);
+        ret = 0;
+        goto cleanup;
+    }
+
+    memset(&vm, 0, sizeof(vm));
+    vm.pid = pid;
+
+    if (!(mon = qemuMonitorOpen(&vm, &config, true, &callbacks))) {
         ret = 0;
         goto cleanup;
     }
@@ -2446,21 +2457,16 @@ cleanup:
     VIR_FREE(monpath);
     VIR_FREE(package);
 
-    if (pidfile) {
+    if (pid != 0) {
         char ebuf[1024];
-        pid_t pid;
-        int rc;
 
-        if ((rc = virPidFileReadPath(pidfile, &pid)) < 0) {
-            VIR_DEBUG("Failed to read pidfile %s: %s",
-                      pidfile, virStrerror(-rc, ebuf, sizeof(ebuf)));
-        } else {
-            VIR_DEBUG("Killing QMP caps process %lld", (long long) pid);
-            if (virProcessKill(pid, SIGKILL) < 0 && errno != ESRCH)
-                VIR_ERROR(_("Failed to kill process %lld: %s"),
-                          (long long) pid,
-                          virStrerror(errno, ebuf, sizeof(ebuf)));
-        }
+        VIR_DEBUG("Killing QMP caps process %lld", (long long) pid);
+        if (virProcessKill(pid, SIGKILL) < 0 && errno != ESRCH)
+            VIR_ERROR(_("Failed to kill process %lld: %s"),
+                      (long long) pid,
+                      virStrerror(errno, ebuf, sizeof(ebuf)));
+    }
+    if (pidfile) {
         unlink(pidfile);
         VIR_FREE(pidfile);
     }