Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
fab43727
Commit
fab43727
authored
May 20, 2010
by
antirez
Browse files
shutdown on SIGTERM
parent
c14753ce
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
fab43727
...
...
@@ -366,6 +366,7 @@ struct redisServer {
int daemonize;
int appendonly;
int appendfsync;
int shutdown_asap;
time_t lastfsync;
int appendfd;
int appendseldb;
...
...
@@ -631,6 +632,7 @@ static int equalStringObjects(robj *a, robj *b);
static void usage();
static int rewriteAppendOnlyFileBackground(void);
static int vmSwapObjectBlocking(robj *key, robj *val);
static int prepareForShutdown();
static void authCommand(redisClient *c);
static void pingCommand(redisClient *c);
...
...
@@ -1420,6 +1422,13 @@ static int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientD
* To access a global var is faster than calling time(NULL) */
server.unixtime = time(NULL);
/* We received a SIGTERM, shutting down here in a safe way, as it is
* not ok doing so inside the signal handler. */
if (server.shutdown_asap) {
if (prepareForShutdown() == REDIS_OK) exit(0);
redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information");
}
/* Show some info about non-empty databases */
for (j = 0; j < server.dbnum; j++) {
long long size, used, vkeys;
...
...
@@ -1687,6 +1696,7 @@ static void initServerConfig() {
server.vm_blocked_clients = 0;
server.hash_max_zipmap_entries = REDIS_HASH_MAX_ZIPMAP_ENTRIES;
server.hash_max_zipmap_value = REDIS_HASH_MAX_ZIPMAP_VALUE;
server.shutdown_asap = 0;
resetServerSaveParams();
...
...
@@ -4150,7 +4160,7 @@ eoferr: /* unexpected end of file is handled here with a fatal exit */
}
/*================================== Shutdown =============================== */
static
void redis
Shutdown() {
static
int prepareFor
Shutdown() {
redisLog(REDIS_WARNING,"User requested shutdown, saving DB...");
/* Kill the saving child if there is a background saving in progress.
We want to avoid race conditions, for instance our saving child may
...
...
@@ -4164,7 +4174,6 @@ static void redisShutdown() {
/* Append only file: fsync() the AOF and exit */
fsync(server.appendfd);
if (server.vm_enabled) unlink(server.vm_swap_file);
exit(0);
} else {
/* Snapshotting. Perform a SYNC SAVE and exit */
if (rdbSave(server.dbfilename) == REDIS_OK) {
...
...
@@ -4172,7 +4181,6 @@ static void redisShutdown() {
unlink(server.pidfile);
redisLog(REDIS_WARNING,"%zu bytes used at exit",zmalloc_used_memory());
redisLog(REDIS_WARNING,"Server exit now, bye bye...");
exit(0);
} else {
/* Ooops.. error saving! The best we can do is to continue
* operating. Note that if there was a background saving process,
...
...
@@ -4180,8 +4188,10 @@ static void redisShutdown() {
* saving aborted, handling special stuff like slaves pending for
* synchronization... */
redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit");
return REDIS_ERR;
}
}
return REDIS_OK;
}
/*================================== Commands =============================== */
...
...
@@ -4623,10 +4633,9 @@ static void bgsaveCommand(redisClient *c) {
}
static void shutdownCommand(redisClient *c) {
redisShutdown();
/* If we got here exit was not called so there was an error */
addReplySds(c,
sdsnew("-ERR can't quit, problems saving the DB\r\n"));
if (prepareForShutdown() == REDIS_OK)
exit(0);
addReplySds(c, sdsnew("-ERR Errors trying to SHUTDOWN. Check logs.\r\n"));
}
static void renameGenericCommand(redisClient *c, int nx) {
...
...
@@ -10818,13 +10827,11 @@ static void segvHandler(int sig, siginfo_t *info, void *secret) {
_exit(0);
}
static void sigHandler(int sig) {
redisLog(REDIS_WARNING,
"======= Redis %s got signal: -%d- =======", REDIS_VERSION, sig);
static void sigtermHandler(int sig) {
REDIS_NOTUSED(sig);
if (sig == SIGTERM) {
redisShutdown();
}
redisLog(REDIS_WARNING,"SIGTERM received, scheduling shutting down...");
server.shutdown_asap = 1;
}
static void setupSigSegvAction(void) {
...
...
@@ -10842,7 +10849,7 @@ static void setupSigSegvAction(void) {
sigaction (SIGBUS, &act, NULL);
act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND;
act.sa_handler = sigHandler;
act.sa_handler = sig
term
Handler;
sigaction (SIGTERM, &act, NULL);
return;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment