diff --git a/src/debug.c b/src/debug.c index 704e4bbf..a9644462 100644 --- a/src/debug.c +++ b/src/debug.c @@ -261,6 +261,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 68704faa..c425bb3e 100644 --- a/src/server.c +++ b/src/server.c @@ -1579,6 +1579,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: *