On 03/03/2015 06:57 PM, Michal Privoznik wrote:
On 02.03.2015 10:37, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1197600

when create a happy vm and then restart libvirtd, we will loss
priv->pidfile, because we don't check if it is there is a pidfile.
However we only use this pidfile when we start the vm, and won't use
it after it start, so this is not a big deal.

But it is strange when vm is offline but pidfile still exist, so
remove vmname.pid in state dir (maybe /run/libvirt/qemu/)when
priv->pidfile is NULL.

Signed-off-by: Luyao Huang <lhu...@redhat.com>
---
  src/qemu/qemu_process.c | 8 ++++++--
  1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 515402e..46b93b3 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -92,6 +92,7 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver,
  {
      char ebuf[1024];
      char *file = NULL;
+    char *pidfile = NULL;
      qemuDomainObjPrivatePtr priv = vm->privateData;
      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
      int ret = -1;
@@ -99,16 +100,19 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver,
      if (virAsprintf(&file, "%s/%s.xml", cfg->stateDir, vm->def->name) < 0)
          goto cleanup;
+ if (virAsprintf(&pidfile, "%s/%s.pid", cfg->stateDir, vm->def->name) < 0)
+        goto cleanup;
If this fails, @file is leaked. And there's a helper function to
generate pid file path: virPidFileBuildPath(). I know it does exactly
the same, but lets use that, so whenever we decide on changing the path,
we need to change it at one place only, instead of digging through
source code just to check if somebody has not used virAsprintf() directly.

Yes, i forgot check if &file will be leaked, thanks for pointing out that.
About the virPidFileBuildPath(), i should say i missed this function from the code :) and use virPidFileBuildPath() is better than virAsprintf() in every sense.
+
      if (unlink(file) < 0 && errno != ENOENT && errno != ENOTDIR)
          VIR_WARN("Failed to remove domain XML for %s: %s",
                   vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf)));
      VIR_FREE(file);
- if (priv->pidfile &&
-        unlink(priv->pidfile) < 0 &&
+    if (unlink(priv->pidfile ? priv->pidfile : pidfile) < 0 &&
          errno != ENOENT)
          VIR_WARN("Failed to remove PID file for %s: %s",
                   vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf)));
+    VIR_FREE(pidfile);
ret = 0;
   cleanup:

While this works, I think we need a different approach:

https://www.redhat.com/archives/libvir-list/2015-March/msg00047.html

Good approach :)
Michal

Luyao

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

Reply via email to