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