mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
Handle wait3() errors.
My guess was that wait3() with WNOHANG could never return -1 and an error. However issue #2897 may possibly indicate that this could happen under non clear conditions. While we try to understand this better, better to handle a return value of -1 explicitly, otherwise in the case a BGREWRITE is in progress but wait3() returns -1, the effect is to match the first branch of the if/else block since server.rdb_child_pid is -1, and call backgroundSaveDoneHandler() without a good reason, that will, in turn, crash the Redis server with an assertion.
This commit is contained in:
parent
a0d41e51c2
commit
da82723858
@ -1198,7 +1198,13 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
|||||||
|
|
||||||
if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);
|
if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);
|
||||||
|
|
||||||
if (pid == server.rdb_child_pid) {
|
if (pid == -1) {
|
||||||
|
serverLog(LL_WARNING,"wait3() returned an error: %s. "
|
||||||
|
"rdb_child_pid = %d, aof_child_pid = %d",
|
||||||
|
strerror(errno),
|
||||||
|
(int) server.rdb_child_pid,
|
||||||
|
(int) server.aof_child_pid);
|
||||||
|
} else if (pid == server.rdb_child_pid) {
|
||||||
backgroundSaveDoneHandler(exitcode,bysignal);
|
backgroundSaveDoneHandler(exitcode,bysignal);
|
||||||
} else if (pid == server.aof_child_pid) {
|
} else if (pid == server.aof_child_pid) {
|
||||||
backgroundRewriteDoneHandler(exitcode,bysignal);
|
backgroundRewriteDoneHandler(exitcode,bysignal);
|
||||||
|
Loading…
Reference in New Issue
Block a user