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