From 75ef41058dc20ca913f25f3edf513ea41cb72ed0 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 4 Jul 2014 15:35:01 +0200 Subject: [PATCH] Use a timeout when reading parent ack from AOF child. --- src/aof.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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();