[libvirt] [PATCH 4/8] Keep pidfile path in qemuDomainObjPrivate struct

Daniel P. Berrange berrange at redhat.com
Mon Jul 4 10:28:24 UTC 2011


Avoid re-formatting the pidfile path everytime we need it. Create
it once when starting the guest, and preserve it until the guest
is shutdown.

* src/libvirt_private.syms, src/util/util.c,
  src/util/util.h: Add virFileReadPidPath
* src/qemu/qemu_domain.h: Add pidfile field
* src/qemu/qemu_process.c: Store pidfile path in qemuDomainObjPrivate
---
 src/libvirt_private.syms |    1 +
 src/qemu/qemu_domain.h   |    1 +
 src/qemu/qemu_process.c  |   27 +++++++++++++++------------
 src/util/util.c          |   45 ++++++++++++++++++++++++++++++---------------
 src/util/util.h          |    2 ++
 5 files changed, 49 insertions(+), 27 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 626ac6c..a7fc179 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1000,6 +1000,7 @@ virFilePid;
 virFileReadAll;
 virFileReadLimFD;
 virFileReadPid;
+virFileReadPidPath;
 virFileResolveLink;
 virFileSanitizePath;
 virFileStripSuffix;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index f282df2..b617b9e 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -82,6 +82,7 @@ struct _qemuDomainObjPrivate {
     bool monError;
     unsigned long long monStart;
     bool gotShutdown;
+    char *pidfile;
 
     int nvcpupids;
     int *vcpupids;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f2c439b..bbbc36f 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -76,6 +76,7 @@ qemuProcessRemoveDomainStatus(struct qemud_driver *driver,
 {
     char ebuf[1024];
     char *file = NULL;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
 
     if (virAsprintf(&file, "%s/%s.xml", driver->stateDir, vm->def->name) < 0) {
         virReportOOMError();
@@ -87,11 +88,12 @@ qemuProcessRemoveDomainStatus(struct qemud_driver *driver,
                  vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf)));
     VIR_FREE(file);
 
-    if (virFileDeletePid(driver->stateDir, vm->def->name) != 0)
+    if (priv->pidfile &&
+        unlink(priv->pidfile) < 0 &&
+        errno != ENOENT)
         VIR_WARN("Failed to remove PID file for %s: %s",
                  vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf)));
 
-
     return 0;
 }
 
@@ -2339,7 +2341,6 @@ int qemuProcessStart(virConnectPtr conn,
     int ret;
     off_t pos = -1;
     char ebuf[1024];
-    char *pidfile = NULL;
     int logfile = -1;
     char *timestamp;
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -2491,16 +2492,18 @@ int qemuProcessStart(virConnectPtr conn,
     priv->monStart = 0;
     priv->gotShutdown = false;
 
-    if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
-        virReportSystemError(ret,
-                             _("Cannot remove stale PID file for %s"),
-                             vm->def->name);
+    VIR_FREE(priv->pidfile);
+    if (!(priv->pidfile = virFilePid(driver->stateDir, vm->def->name))) {
+        virReportSystemError(errno,
+                             "%s", _("Failed to build pidfile path."));
         goto cleanup;
     }
 
-    if (!(pidfile = virFilePid(driver->stateDir, vm->def->name))) {
+    if (unlink(priv->pidfile) < 0 &&
+        errno != ENOENT) {
         virReportSystemError(errno,
-                             "%s", _("Failed to build pidfile path."));
+                             _("Cannot remove stale PID file %s"),
+                             priv->pidfile);
         goto cleanup;
     }
 
@@ -2591,16 +2594,15 @@ int qemuProcessStart(virConnectPtr conn,
     virCommandSetOutputFD(cmd, &logfile);
     virCommandSetErrorFD(cmd, &logfile);
     virCommandNonblockingFDs(cmd);
-    virCommandSetPidFile(cmd, pidfile);
+    virCommandSetPidFile(cmd, priv->pidfile);
     virCommandDaemonize(cmd);
     virCommandRequireHandshake(cmd);
 
     ret = virCommandRun(cmd, NULL);
-    VIR_FREE(pidfile);
 
     /* wait for qemu process to show up */
     if (ret == 0) {
-        if (virFileReadPid(driver->stateDir, vm->def->name, &vm->pid)) {
+        if (virFileReadPidPath(priv->pidfile, &vm->pid)) {
             qemuReportError(VIR_ERR_INTERNAL_ERROR,
                             _("Domain %s didn't show up"), vm->def->name);
             ret = -1;
@@ -2946,6 +2948,7 @@ retry:
     priv->nvcpupids = 0;
     qemuCapsFree(priv->qemuCaps);
     priv->qemuCaps = NULL;
+    VIR_FREE(priv->pidfile);
 
     /* The "release" hook cleans up additional resources */
     if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
diff --git a/src/util/util.c b/src/util/util.c
index 13973c3..5f93658 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -1231,42 +1231,57 @@ cleanup:
     return rc;
 }
 
-int virFileReadPid(const char *dir,
-                   const char *name,
-                   pid_t *pid)
+
+int virFileReadPidPath(const char *path,
+                       pid_t *pid)
 {
-    int rc;
     FILE *file;
-    char *pidfile = NULL;
+    int rc;
+
     *pid = 0;
 
-    if (name == NULL || dir == NULL) {
-        rc = EINVAL;
+    if (!(file = fopen(path, "r"))) {
+        rc = errno;
         goto cleanup;
     }
 
-    if (!(pidfile = virFilePid(dir, name))) {
-        rc = ENOMEM;
+    if (fscanf(file, "%d", pid) != 1) {
+        rc = EINVAL;
+        VIR_FORCE_FCLOSE(file);
         goto cleanup;
     }
 
-    if (!(file = fopen(pidfile, "r"))) {
+    if (VIR_FCLOSE(file) < 0) {
         rc = errno;
         goto cleanup;
     }
 
-    if (fscanf(file, "%d", pid) != 1) {
+    rc = 0;
+
+ cleanup:
+    return rc;
+}
+
+
+int virFileReadPid(const char *dir,
+                   const char *name,
+                   pid_t *pid)
+{
+    int rc;
+    char *pidfile = NULL;
+    *pid = 0;
+
+    if (name == NULL || dir == NULL) {
         rc = EINVAL;
-        VIR_FORCE_FCLOSE(file);
         goto cleanup;
     }
 
-    if (VIR_FCLOSE(file) < 0) {
-        rc = errno;
+    if (!(pidfile = virFilePid(dir, name))) {
+        rc = ENOMEM;
         goto cleanup;
     }
 
-    rc = 0;
+    rc = virFileReadPidPath(pidfile, pid);
 
  cleanup:
     VIR_FREE(pidfile);
diff --git a/src/util/util.h b/src/util/util.h
index 1555653..f4e0148 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -125,6 +125,8 @@ int virFileWritePidPath(const char *path,
 int virFileWritePid(const char *dir,
                     const char *name,
                     pid_t pid) ATTRIBUTE_RETURN_CHECK;
+int virFileReadPidPath(const char *path,
+                       pid_t *pid) ATTRIBUTE_RETURN_CHECK;
 int virFileReadPid(const char *dir,
                    const char *name,
                    pid_t *pid) ATTRIBUTE_RETURN_CHECK;
-- 
1.7.4.4




More information about the libvir-list mailing list