提交 633a9410 编写于 作者: P Pieter Noordhuis

Save RDB on SIGTERM (see issue #471)

上级 d9fac6c0
...@@ -859,7 +859,7 @@ void initServer() { ...@@ -859,7 +859,7 @@ void initServer() {
signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN);
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
setupSigSegvAction(); setupSignalHandlers();
if (server.syslog_enabled) { if (server.syslog_enabled) {
openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
...@@ -1705,10 +1705,8 @@ int main(int argc, char **argv) { ...@@ -1705,10 +1705,8 @@ int main(int argc, char **argv) {
return 0; return 0;
} }
/* ============================= Backtrace support ========================= */
#ifdef HAVE_BACKTRACE #ifdef HAVE_BACKTRACE
void *getMcontextEip(ucontext_t *uc) { static void *getMcontextEip(ucontext_t *uc) {
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
return (void*) uc->uc_mcontext.mc_eip; return (void*) uc->uc_mcontext.mc_eip;
#elif defined(__dietlibc__) #elif defined(__dietlibc__)
...@@ -1736,7 +1734,7 @@ void *getMcontextEip(ucontext_t *uc) { ...@@ -1736,7 +1734,7 @@ void *getMcontextEip(ucontext_t *uc) {
#endif #endif
} }
void segvHandler(int sig, siginfo_t *info, void *secret) { static void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
void *trace[100]; void *trace[100];
char **messages = NULL; char **messages = NULL;
int i, trace_size = 0; int i, trace_size = 0;
...@@ -1775,37 +1773,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) { ...@@ -1775,37 +1773,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) {
sigaction (sig, &act, NULL); sigaction (sig, &act, NULL);
kill(getpid(),sig); kill(getpid(),sig);
} }
#endif /* HAVE_BACKTRACE */
void sigtermHandler(int sig) { static void sigtermHandler(int sig) {
REDIS_NOTUSED(sig); REDIS_NOTUSED(sig);
redisLog(REDIS_WARNING,"SIGTERM received, scheduling shutting down..."); redisLog(REDIS_WARNING,"Received SIGTERM, scheduling shutdown...");
server.shutdown_asap = 1; server.shutdown_asap = 1;
} }
void setupSigSegvAction(void) { void setupSignalHandlers(void) {
struct sigaction act; struct sigaction act;
sigemptyset (&act.sa_mask); /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction * Otherwise, sa_handler is used. */
* is used. Otherwise, sa_handler is used */ sigemptyset(&act.sa_mask);
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);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND; act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
act.sa_handler = sigtermHandler; act.sa_handler = sigtermHandler;
sigaction (SIGTERM, &act, NULL); sigaction(SIGTERM, &act, NULL);
return;
}
#else /* HAVE_BACKTRACE */ #ifdef HAVE_BACKTRACE
void setupSigSegvAction(void) { 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 */ /* The End */
...@@ -796,7 +796,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj); ...@@ -796,7 +796,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj);
/* Core functions */ /* Core functions */
void freeMemoryIfNeeded(void); void freeMemoryIfNeeded(void);
int processCommand(redisClient *c); int processCommand(redisClient *c);
void setupSigSegvAction(void); void setupSignalHandlers(void);
struct redisCommand *lookupCommand(sds name); struct redisCommand *lookupCommand(sds name);
struct redisCommand *lookupCommandByCString(char *s); struct redisCommand *lookupCommandByCString(char *s);
void call(redisClient *c, struct redisCommand *cmd); void call(redisClient *c, struct redisCommand *cmd);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册