summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeir Shpilraien (Spielrein) <meir@redislabs.com>2020-12-22 15:17:39 +0200
committerOran Agra <oran@redislabs.com>2021-01-12 16:25:37 +0200
commite9f674e5fb6f778d182c16b629fbd4fd5956ef29 (patch)
treedb6449645696b595f708a6a12b5d8c9786ea4989
parent0f8d47c9eda22114ffd632b86d4c0fb7f4062ef4 (diff)
downloadredis-e9f674e5fb6f778d182c16b629fbd4fd5956ef29.tar.gz
Fix issue where fork process deletes the parent pidfile (#8231)
Turns out that when the fork child crashes, the crash log was deleting the pidfile from the disk (although the parent is still running. Now we set the pidfile of the fork process to NULL so the fork process will never deletes it. (cherry picked from commit 92a483bca2df734aff5caada6c23409ed6256773)
-rw-r--r--src/debug.c2
-rw-r--r--src/server.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/debug.c b/src/debug.c
index 389b4e36f..a5786edc0 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -1724,7 +1724,7 @@ void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
);
/* free(messages); Don't call free() with possibly corrupted memory. */
- if (server.daemonize && server.supervised == 0) unlink(server.pidfile);
+ if (server.daemonize && server.supervised == 0 && server.pidfile) unlink(server.pidfile);
/* Make sure we exit with the right signal at the end. So for instance
* the core will be dumped if enabled. */
diff --git a/src/server.c b/src/server.c
index 51beeecbd..5f5333ce4 100644
--- a/src/server.c
+++ b/src/server.c
@@ -5085,6 +5085,10 @@ void closeClildUnusedResourceAfterFork() {
closeListeningSockets(0);
if (server.cluster_enabled && server.cluster_config_file_lock_fd != -1)
close(server.cluster_config_file_lock_fd); /* don't care if this fails */
+
+ /* Clear server.pidfile, this is the parent pidfile which should not
+ * be touched (or deleted) by the child (on exit / crash) */
+ server.pidfile = NULL;
}
/* purpose is one of CHILD_TYPE_ types */