From bb7e00b6990b79ad2383cd290346d994d45aed95 Mon Sep 17 00:00:00 2001 From: WuYunlong Date: Fri, 25 Sep 2020 13:08:06 +0800 Subject: [PATCH] Add fsync to readSyncBulkPayload(). (#7839) We should sync temp DB file before renaming as rdb_fsync_range does not use flag `SYNC_FILE_RANGE_WAIT_AFTER`. Refer to `Linux Programmer's Manual`: SYNC_FILE_RANGE_WAIT_AFTER Wait upon write-out of all pages in the range after performing any write. (cherry picked from commit 0d62caab2113fc12077aadd469e80dd19ca78db2) --- src/replication.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/replication.c b/src/replication.c index 047449c4b..acc0befbb 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1752,6 +1752,17 @@ void readSyncBulkPayload(connection *conn) { killRDBChild(); } + /* Make sure the new file (also used for persistence) is fully synced + * (not covered by earlier calls to rdb_fsync_range). */ + if (fsync(server.repl_transfer_fd) == -1) { + serverLog(LL_WARNING, + "Failed trying to sync the temp DB to disk in " + "MASTER <-> REPLICA synchronization: %s", + strerror(errno)); + cancelReplicationHandshake(); + return; + } + /* Rename rdb like renaming rewrite aof asynchronously. */ int old_rdb_fd = open(server.rdb_filename,O_RDONLY|O_NONBLOCK); if (rename(server.repl_transfer_tmpfile,server.rdb_filename) == -1) {