From 98a64523c451d9f6519342b78a857a4aa729cf58 Mon Sep 17 00:00:00 2001 From: Andrey Bugaevskiy Date: Wed, 19 Sep 2018 19:58:39 +0300 Subject: [PATCH 1/2] Prevent RDB autosave from overwriting full resync results During the full database resync we may still have unsaved changes on the receiving side. This causes a race condition between synced data rename/load and the rename of rdbSave tempfile. --- src/replication.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/replication.c b/src/replication.c index 38b1d161..72d7b892 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1814,6 +1814,13 @@ void syncWithMaster(aeEventLoop *el, int fd, void *privdata, int mask) { } } + /* Stop background saving for obsolete database state. */ + server.dirty = 0; + if (server.rdb_child_pid != -1) { + kill(server.rdb_child_pid,SIGUSR1); + rdbRemoveTempFile(server.rdb_child_pid); + } + /* Prepare a suitable temp file for bulk transfer */ while(maxtries--) { snprintf(tmpfile,256, From 466c277b4fedefd7fda42959e3e68177a6de254b Mon Sep 17 00:00:00 2001 From: Andrey Bugaevskiy Date: Thu, 27 Sep 2018 19:38:58 +0300 Subject: [PATCH 2/2] Move child termination to readSyncBulkPayload --- src/replication.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/replication.c b/src/replication.c index 72d7b892..a40d26fb 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1245,6 +1245,12 @@ void readSyncBulkPayload(aeEventLoop *el, int fd, void *privdata, int mask) { if (eof_reached) { int aof_is_enabled = server.aof_state != AOF_OFF; + /* Ensure background save doesn't overwrite synced data */ + if (server.rdb_child_pid != -1) { + kill(server.rdb_child_pid,SIGUSR1); + rdbRemoveTempFile(server.rdb_child_pid); + } + if (rename(server.repl_transfer_tmpfile,server.rdb_filename) == -1) { serverLog(LL_WARNING,"Failed trying to rename the temp DB into dump.rdb in MASTER <-> REPLICA synchronization: %s", strerror(errno)); cancelReplicationHandshake(); @@ -1814,13 +1820,6 @@ void syncWithMaster(aeEventLoop *el, int fd, void *privdata, int mask) { } } - /* Stop background saving for obsolete database state. */ - server.dirty = 0; - if (server.rdb_child_pid != -1) { - kill(server.rdb_child_pid,SIGUSR1); - rdbRemoveTempFile(server.rdb_child_pid); - } - /* Prepare a suitable temp file for bulk transfer */ while(maxtries--) { snprintf(tmpfile,256,