diff --git a/src/rdb.c b/src/rdb.c index ce5f99c9a..2d6ac85fc 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -766,7 +766,7 @@ int rdbSaveBackground(char *filename) { void rdbRemoveTempFile(pid_t childpid) { char tmpfile[256]; - snprintf(tmpfile,256,"temp-%d.rdb", (int) childpid); + snprintf(tmpfile,sizeof(tmpfile),"temp-%d.rdb", (int) childpid); unlink(tmpfile); } diff --git a/src/redis.c b/src/redis.c index faed67331..c5c3f79bb 100644 --- a/src/redis.c +++ b/src/redis.c @@ -3413,6 +3413,18 @@ static void sigShutdownHandler(int sig) { msg = "Received shutdown signal, scheduling shutdown..."; }; + /* SIGINT is often delivered via Ctrl+C in an interactive session. + * If we receive the signal the second time, we interpret this as + * the user really wanting to quit ASAP without waiting to persist + * on disk. */ + if (server.shutdown_asap && sig == SIGINT) { + redisLogFromHandler(REDIS_WARNING, "You insist... exiting now."); + rdbRemoveTempFile(getpid()); + exit(1); /* Exit with an error since this was not a clean shutdown. */ + } else if (server.loading) { + exit(0); + } + redisLogFromHandler(REDIS_WARNING, msg); server.shutdown_asap = 1; } @@ -3426,7 +3438,7 @@ void setupSignalHandlers(void) { act.sa_flags = 0; act.sa_handler = sigShutdownHandler; sigaction(SIGTERM, &act, NULL); - signal(SIGINT, sigShutdownHandler); + sigaction(SIGINT, &act, NULL); #ifdef HAVE_BACKTRACE sigemptyset(&act.sa_mask);