From 35a0c772b5ef407b700db051233144b6bac8fea3 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 13 Oct 2015 11:08:24 +0200 Subject: [PATCH] DEBUG RESTART/CRASH-AND-RECOVER [delay] implemented. --- src/debug.c | 14 ++++++++++++++ src/server.c | 3 +++ 2 files changed, 17 insertions(+) diff --git a/src/debug.c b/src/debug.c index 48a1b513..92cfe129 100644 --- a/src/debug.c +++ b/src/debug.c @@ -259,6 +259,20 @@ void inputCatSds(void *result, const char *str) { void debugCommand(client *c) { if (!strcasecmp(c->argv[1]->ptr,"segfault")) { *((char*)-1) = 'x'; + } else if (!strcasecmp(c->argv[1]->ptr,"restart") || + !strcasecmp(c->argv[1]->ptr,"crash-and-recover")) + { + long long delay = 0; + if (c->argc >= 3) { + if (getLongLongFromObjectOrReply(c, c->argv[2], &delay, NULL) + != C_OK) return; + if (delay < 0) delay = 0; + } + int flags = !strcasecmp(c->argv[1]->ptr,"restart") ? + (RESTART_SERVER_GRACEFULLY|RESTART_SERVER_CONFIG_REWRITE) : + RESTART_SERVER_NONE; + restartServer(flags,delay); + addReplyError(c,"failed to restart the server. Check server logs."); } else if (!strcasecmp(c->argv[1]->ptr,"oom")) { void *ptr = zmalloc(ULONG_MAX); /* Should trigger an out of memory. */ zfree(ptr); diff --git a/src/server.c b/src/server.c index 96cd28d4..7c5b2bab 100644 --- a/src/server.c +++ b/src/server.c @@ -1601,6 +1601,9 @@ extern char **environ; /* Restart the server, executing the same executable that started this * instance, with the same arguments and configuration file. * + * The function is designed to directly call execve() so that the new + * server instance will retain the PID of the previous one. + * * The list of flags, that may be bitwise ORed together, alter the * behavior of this function: *