From 7bb25f8a46cafee90ba927d98141ccfa57e190df Mon Sep 17 00:00:00 2001 From: antirez Date: Thu, 7 Aug 2014 16:32:50 +0200 Subject: Force quit when receiving a second SIGINT. Also quit ASAP when we are still loading a DB, since care is not needed in this special condition, especially for a SIGINT. --- src/rdb.c | 2 +- src/redis.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) 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); -- cgit v1.2.1