[libvirt] [PATCH v2 1/2] util: Introduce virPidFileForceCleanupPath

Martin Kletzander mkletzan at redhat.com
Wed Oct 29 13:41:30 UTC 2014


Ping.

On Sun, Oct 12, 2014 at 02:12:20PM +0200, Martin Kletzander wrote:
>This function is used to cleanup a pidfile doing whatever it takes, even
>killing the owning process.
>
>Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
>---
>v2:
> - Don't use "/proc", but simply just try to acquire the pidfile.
> - https://www.redhat.com/archives/libvir-list/2014-October/msg00320.html
>
> src/libvirt_private.syms |  1 +
> src/util/virpidfile.c    | 42 ++++++++++++++++++++++++++++++++++++++++++
> src/util/virpidfile.h    |  2 ++
> 3 files changed, 45 insertions(+)
>
>diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>index d6265ac..30d100d 100644
>--- a/src/libvirt_private.syms
>+++ b/src/libvirt_private.syms
>@@ -1810,6 +1810,7 @@ virPidFileBuildPath;
> virPidFileConstructPath;
> virPidFileDelete;
> virPidFileDeletePath;
>+virPidFileForceCleanupPath;
> virPidFileRead;
> virPidFileReadIfAlive;
> virPidFileReadPath;
>diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c
>index a3b8846..a64a1cf 100644
>--- a/src/util/virpidfile.c
>+++ b/src/util/virpidfile.c
>@@ -37,6 +37,7 @@
> #include "c-ctype.h"
> #include "areadlink.h"
> #include "virstring.h"
>+#include "virprocess.h"
>
> #define VIR_FROM_THIS VIR_FROM_NONE
>
>@@ -567,3 +568,44 @@ virPidFileConstructPath(bool privileged,
>     VIR_FREE(rundir);
>     return ret;
> }
>+
>+
>+/**
>+ * virPidFileForceCleanupPath:
>+ *
>+ * Check if the pidfile is left around and clean it up whatever it
>+ * takes.  This doesn't raise an error.  This function must not be
>+ * called multiple times with the same path, be it in threads or
>+ * processes.
>+ *
>+ * Returns 0 if the pidfile was successfully cleaned up, -1 otherwise.
>+ */
>+int
>+virPidFileForceCleanupPath(const char *path)
>+{
>+    pid_t pid = 0;
>+    int fd = -1;
>+
>+    if (!virFileExists(path))
>+        return 0;
>+
>+    if (virPidFileReadPath(path, &pid) < 0)
>+        return -1;
>+
>+    if (virPidFileAcquirePath(path, false, 0) == 0) {
>+        virPidFileReleasePath(path, fd);
>+    } else {
>+        virResetLastError();
>+
>+        /* Only kill the process if the pid is valid one.  0 means
>+         * there is somebody else doing the same pidfile cleanup
>+         * machinery. */
>+        if (pid)
>+            virProcessKillPainfully(pid, true);
>+
>+        if (virPidFileDeletePath(path) < 0)
>+            return -1;
>+    }
>+
>+    return 0;
>+}
>diff --git a/src/util/virpidfile.h b/src/util/virpidfile.h
>index ca1dbff..eb6516c 100644
>--- a/src/util/virpidfile.h
>+++ b/src/util/virpidfile.h
>@@ -74,4 +74,6 @@ int virPidFileConstructPath(bool privileged,
>                             const char *progname,
>                             char **pidfile);
>
>+int virPidFileForceCleanupPath(const char *path) ATTRIBUTE_NONNULL(1);
>+
> #endif /* __VIR_PIDFILE_H__ */
>--
>2.1.2
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20141029/5311da6d/attachment-0001.sig>


More information about the libvir-list mailing list