[libvirt] [PATCH RFC 21/22] qemu_process: Use unique directories for QMP processes

Chris Venteicher posted 22 patches 6 years ago
[libvirt] [PATCH RFC 21/22] qemu_process: Use unique directories for QMP processes
Posted by Chris Venteicher 6 years ago
Multiple QEMU processes for QMP commands can operate concurrently.

Use a unique directory under libDir for each QEMU processes
to avoid pidfile and unix socket collision between processes.

The pid file name is changed from "capabilities.pidfile" to "qmp.pid"
because we no longer need to avoid a possible clash with a qemu domain
called "capabilities" now that the processes artifacts are stored in
their own unique temporary directories.

"Capabilities" was changed to "qmp" in the pid file name because these
processes are no longer specific to the capabilities usecase and are
more generic in terms of being used for any general purpose QMP message
exchanges with a QEMU process that is not associated with a domain.

Signed-off-by: Chris Venteicher <cventeic@redhat.com>
---
 src/qemu/qemu_process.c | 26 ++++++++++++++++----------
 src/qemu/qemu_process.h |  1 +
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index eba2cd6765..4dbc7038fd 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8090,6 +8090,7 @@ qemuProcessFree(qemuProcessPtr proc)
 
     VIR_FREE(proc->binary);
     VIR_FREE(proc->libDir);
+    VIR_FREE(proc->uniqDir);
     VIR_FREE(proc->monpath);
     VIR_FREE(proc->monarg);
     VIR_FREE(proc->pidfile);
@@ -8148,33 +8149,33 @@ qemuProcessNew(const char *binary,
 static int
 qemuProcessInitQmp(qemuProcessPtr proc)
 {
+    char *template = NULL;
     int ret = -1;
 
     VIR_DEBUG("Beginning VM startup process"
               "emulator=%s",
               proc->binary);
 
-    /* the ".sock" sufix is important to avoid a possible clash with a qemu
-     * domain called "capabilities"
-     */
-    if (virAsprintf(&proc->monpath, "%s/%s", proc->libDir,
-                    "capabilities.monitor.sock") < 0)
+    if (virAsprintf(&template, "%s/qemu.XXXXXX", proc->libDir) < 0)
+        goto cleanup;
+
+    proc->uniqDir = mkdtemp(template);
+
+    if (virAsprintf(&proc->monpath, "%s/%s", proc->uniqDir,
+                    "qmp.monitor") < 0)
         goto cleanup;
 
     if (virAsprintf(&proc->monarg, "unix:%s,server,nowait", proc->monpath) < 0)
         goto cleanup;
 
-    /* ".pidfile" suffix is used rather than ".pid" to avoid a possible clash
-     * with a qemu domain called "capabilities"
+    /*
      * Normally we'd use runDir for pid files, but because we're using
      * -daemonize we need QEMU to be allowed to create them, rather
      * than libvirtd. So we're using libDir which QEMU can write to
      */
-    if (virAsprintf(&proc->pidfile, "%s/%s", proc->libDir, "capabilities.pidfile") < 0)
+    if (virAsprintf(&proc->pidfile, "%s/%s", proc->uniqDir, "qmp.pid") < 0)
         goto cleanup;
 
-    virPidFileForceCleanupPath(proc->pidfile);
-
     ret = 0;
 
  cleanup:
@@ -8415,4 +8416,9 @@ void qemuProcessStopQmp(qemuProcessPtr proc)
         unlink(proc->pidfile);
 
     proc->pid = 0;
+
+
+    if (proc->uniqDir)
+        rmdir(proc->uniqDir);
+
 }
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index d1541d5407..f66fc0c82c 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -225,6 +225,7 @@ struct _qemuProcess {
     char *monarg;
     char *monpath;
     char *pidfile;
+    char *uniqDir;
     virCommandPtr cmd;
     qemuMonitorPtr mon;
     pid_t pid;
-- 
2.17.1

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