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

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



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 03d2ddb..7ddf2bb 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -995,6 +995,7 @@ virFilePid;
 virFileReadAll;
 virFileReadLimFD;
 virFileReadPid;
+virFileReadPidPath;
 virFileResolveLink;
 virFileSanitizePath;
 virFileStripSuffix;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 3d041fc..b1d17cd 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 8e09e52..16d0c0a 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -74,6 +74,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();
@@ -85,11 +86,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;
 }
 
@@ -2320,7 +2322,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;
@@ -2471,16 +2472,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;
     }
 
@@ -2571,16 +2574,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;
@@ -2917,6 +2919,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 8f6d887..5b5e199 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -1232,42 +1232,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 0c43f7a..6aecb1b 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


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