From 2bc8db9ca5f80e7c69ca51932aed05745d727ec5 Mon Sep 17 00:00:00 2001 From: ShooterIT Date: Tue, 31 Dec 2019 21:35:56 +0800 Subject: [PATCH] Rename rdb asynchronously --- src/replication.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/replication.c b/src/replication.c index 68dc77a61..b7e77184a 100644 --- a/src/replication.c +++ b/src/replication.c @@ -31,6 +31,7 @@ #include "server.h" #include "cluster.h" +#include "bio.h" #include #include @@ -1616,14 +1617,20 @@ void readSyncBulkPayload(connection *conn) { killRDBChild(); } + /* 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) { serverLog(LL_WARNING, "Failed trying to rename the temp DB into %s in " "MASTER <-> REPLICA synchronization: %s", server.rdb_filename, strerror(errno)); cancelReplicationHandshake(); + if (old_rdb_fd != -1) close(old_rdb_fd); return; } + /* Close old rdb asynchronously. */ + if (old_rdb_fd != -1) bioCreateBackgroundJob(BIO_CLOSE_FILE,(void*)(long)old_rdb_fd,NULL,NULL); + if (rdbLoad(server.rdb_filename,&rsi,RDBFLAGS_REPLICATION) != C_OK) { serverLog(LL_WARNING, "Failed trying to load the MASTER synchronization "