diff --git a/src/aof.c b/src/aof.c index 868a3297..ac5fb8aa 100644 --- a/src/aof.c +++ b/src/aof.c @@ -1040,9 +1040,15 @@ int rewriteAppendOnlyFile(char *filename) { } /* Ask the master to stop sending diffs. */ - write(server.aof_pipe_write_ack_to_parent,"!",1); - if (read(server.aof_pipe_read_ack_from_parent,&byte,1) != 1 || + if (write(server.aof_pipe_write_ack_to_parent,"!",1) != 1) goto werr; + if (anetNonBlock(NULL,server.aof_pipe_read_ack_from_parent) != ANET_OK) + goto werr; + /* We read the ACK from the server using a 10 seconds timeout. Normally + * it should reply ASAP, but just in case we lose its reply, we are sure + * the child will eventually get terminated. */ + if (syncRead(server.aof_pipe_read_ack_from_parent,&byte,1,5000) != 1 || byte != '!') goto werr; + redisLog(REDIS_NOTICE,"Parent agreed to stop sending diffs. Finalizing AOF..."); /* Read the final diff if any. */ aofReadDiffFromParent();