From 6ddf0ea29340891d9934892b6c239d160d1ee0c4 Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" Date: Wed, 1 Nov 2017 17:32:23 +0800 Subject: [PATCH] PSYNC2: safe free backlog when reach the time limit When we free the backlog, we should use a new replication ID and clear the ID2. Since without backlog we can not increment master_repl_offset even do write commands, that may lead to inconsistency when we try to connect a "slave-before" master (if this master is our slave before, our replid equals the master's replid2). As the master have our history, so we can match the master's replid2 and second_replid_offset, that make partial sync work, but the data is inconsistent. --- src/replication.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/replication.c b/src/replication.c index e0b3d910..fe7b0f73 100644 --- a/src/replication.c +++ b/src/replication.c @@ -2613,6 +2613,18 @@ void replicationCron(void) { time_t idle = server.unixtime - server.repl_no_slaves_since; if (idle > server.repl_backlog_time_limit) { + /* When we free the backlog, we always use a new + * replication ID and clear the ID2. Since without + * backlog we can not increment master_repl_offset + * even do write commands, that may lead to inconsistency + * when we try to connect a "slave-before" master + * (if this master is our slave before, our replid + * equals the master's replid2). As the master have our + * history, so we can match the master's replid2 and + * second_replid_offset, that make partial sync work, + * but the data is inconsistent. */ + changeReplicationId(); + clearReplicationId2(); freeReplicationBacklog(); serverLog(LL_NOTICE, "Replication backlog freed after %d seconds "