Add a version of virPidFileForceCleanupPath with an extradelay
parameter for processes where the default timeout is not enough.
Signed-off-by: Ján Tomko <jtomko(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virpidfile.c | 16 +++++++++++++++-
src/util/virpidfile.h | 2 ++
3 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 2efa787664..dc25dd6ac0 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3027,6 +3027,7 @@ virPidFileConstructPath;
virPidFileDelete;
virPidFileDeletePath;
virPidFileForceCleanupPath;
+virPidFileForceCleanupPathDelay;
virPidFileRead;
virPidFileReadIfAlive;
virPidFileReadPath;
diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c
index c6389c1869..6c3d869460 100644
--- a/src/util/virpidfile.c
+++ b/src/util/virpidfile.c
@@ -511,10 +511,14 @@ virPidFileConstructPath(bool privileged,
* called multiple times with the same path, be it in threads or
* processes. This function does not raise any errors.
*
+ * If @extradelay (in seconds) is specified, we wait for
+ * 15 + extradelay seconds more.
+ *
* Returns 0 if the pidfile was successfully cleaned up, -1 otherwise.
*/
int
-virPidFileForceCleanupPath(const char *path)
+virPidFileForceCleanupPathDelay(const char *path,
+ unsigned int extradelay)
{
pid_t pid = 0;
int fd = -1;
@@ -532,6 +536,9 @@ virPidFileForceCleanupPath(const char *path)
/* Only kill the process if the pid is valid one. 0 means
* there is somebody else doing the same pidfile cleanup
* machinery. */
+ if (extradelay &&
+ virProcessKillPainfullyDelay(pid, false, extradelay) >= 0)
+ pid = 0;
if (pid)
virProcessKillPainfully(pid, true);
@@ -544,3 +551,10 @@ virPidFileForceCleanupPath(const char *path)
return 0;
}
+
+
+int
+virPidFileForceCleanupPath(const char *path)
+{
+ return virPidFileForceCleanupPathDelay(path, 0);
+}
diff --git a/src/util/virpidfile.h b/src/util/virpidfile.h
index 370a59892e..ef26377375 100644
--- a/src/util/virpidfile.h
+++ b/src/util/virpidfile.h
@@ -73,4 +73,6 @@ int virPidFileConstructPath(bool privileged,
const char *progname,
char **pidfile);
+int virPidFileForceCleanupPathDelay(const char *path,
+ unsigned int extradelay) ATTRIBUTE_NONNULL(1);
int virPidFileForceCleanupPath(const char *path) ATTRIBUTE_NONNULL(1);
--
2.31.1