summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-03-06 17:49:22 +0100
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-03-06 17:49:22 +0100
commit2d2c17b075dfb5a24514819e568c72531300d6ae (patch)
treeff5be7ed444d5688124296e1c9345224c5c98995
parent048c0f0f37a67f3f33bdd5b179225ec853c1d8dc (diff)
downloadredis-2d2c17b075dfb5a24514819e568c72531300d6ae.tar.gz
Save RDB on SIGTERM (see issue #471)
-rw-r--r--src/redis.c46
-rw-r--r--src/redis.h2
2 files changed, 22 insertions, 26 deletions
diff --git a/src/redis.c b/src/redis.c
index 613f5036d..90ed02dbf 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -837,7 +837,7 @@ void initServer() {
signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
- setupSigSegvAction();
+ setupSignalHandlers();
if (server.syslog_enabled) {
openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
@@ -1574,10 +1574,8 @@ int main(int argc, char **argv) {
return 0;
}
-/* ============================= Backtrace support ========================= */
-
#ifdef HAVE_BACKTRACE
-void *getMcontextEip(ucontext_t *uc) {
+static void *getMcontextEip(ucontext_t *uc) {
#if defined(__FreeBSD__)
return (void*) uc->uc_mcontext.mc_eip;
#elif defined(__dietlibc__)
@@ -1605,7 +1603,7 @@ void *getMcontextEip(ucontext_t *uc) {
#endif
}
-void segvHandler(int sig, siginfo_t *info, void *secret) {
+static void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
void *trace[100];
char **messages = NULL;
int i, trace_size = 0;
@@ -1644,37 +1642,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) {
sigaction (sig, &act, NULL);
kill(getpid(),sig);
}
+#endif /* HAVE_BACKTRACE */
-void sigtermHandler(int sig) {
+static void sigtermHandler(int sig) {
REDIS_NOTUSED(sig);
- redisLog(REDIS_WARNING,"SIGTERM received, scheduling shutting down...");
+ redisLog(REDIS_WARNING,"Received SIGTERM, scheduling shutdown...");
server.shutdown_asap = 1;
}
-void setupSigSegvAction(void) {
+void setupSignalHandlers(void) {
struct sigaction act;
- sigemptyset (&act.sa_mask);
- /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction
- * is used. Otherwise, sa_handler is used */
- act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
- act.sa_sigaction = segvHandler;
- sigaction (SIGSEGV, &act, NULL);
- sigaction (SIGBUS, &act, NULL);
- sigaction (SIGFPE, &act, NULL);
- sigaction (SIGILL, &act, NULL);
- sigaction (SIGBUS, &act, NULL);
-
+ /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
+ * Otherwise, sa_handler is used. */
+ sigemptyset(&act.sa_mask);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
act.sa_handler = sigtermHandler;
- sigaction (SIGTERM, &act, NULL);
- return;
-}
+ sigaction(SIGTERM, &act, NULL);
-#else /* HAVE_BACKTRACE */
-void setupSigSegvAction(void) {
+#ifdef HAVE_BACKTRACE
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
+ act.sa_sigaction = sigsegvHandler;
+ sigaction(SIGSEGV, &act, NULL);
+ sigaction(SIGBUS, &act, NULL);
+ sigaction(SIGFPE, &act, NULL);
+ sigaction(SIGILL, &act, NULL);
+#endif
+ return;
}
-#endif /* HAVE_BACKTRACE */
/* The End */
diff --git a/src/redis.h b/src/redis.h
index b833150b4..fddf29ed0 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -777,7 +777,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj);
/* Core functions */
void freeMemoryIfNeeded(void);
int processCommand(redisClient *c);
-void setupSigSegvAction(void);
+void setupSignalHandlers(void);
struct redisCommand *lookupCommand(sds name);
struct redisCommand *lookupCommandByCString(char *s);
void call(redisClient *c, struct redisCommand *cmd);