From 30bba7f7de265db652d958f8fd8005191c560efa Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 26 Dec 2021 05:16:58 -0500 Subject: [PATCH] Fix partial sync failures Former-commit-id: 7e9f7c0c4f520392a930ab72951e287f52c711ab --- src/replication.cpp | 22 ++++++++++++---------- src/server.cpp | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/replication.cpp b/src/replication.cpp index 77fc8a564..b1ad41b14 100644 --- a/src/replication.cpp +++ b/src/replication.cpp @@ -2165,18 +2165,20 @@ void saveMasterStatusToStorage(bool fShutdown) g_pserver->metadataDb->insert("repl-offset", 11, &g_pserver->master_repl_offset, sizeof(g_pserver->master_repl_offset), true); else g_pserver->metadataDb->insert("repl-offset", 11, &tmp, sizeof(g_pserver->master_repl_offset), true); + if (g_pserver->fActiveReplica || (!listLength(g_pserver->masters) && g_pserver->repl_backlog)) { - g_pserver->metadataDb->insert("repl-stream-db", 14, g_pserver->replicaseldb == -1 ? 0 : &g_pserver->replicaseldb, - g_pserver->replicaseldb == -1 ? 0 : sizeof(g_pserver->replicaseldb), true); - } + int zero = 0; + g_pserver->metadataDb->insert("repl-stream-db", 14, g_pserver->replicaseldb == -1 ? &zero : &g_pserver->replicaseldb, + sizeof(g_pserver->replicaseldb), true); + } else { + struct redisMaster *miFirst = (redisMaster*)(listLength(g_pserver->masters) ? listNodeValue(listFirst(g_pserver->masters)) : NULL); - struct redisMaster *miFirst = (redisMaster*)(listLength(g_pserver->masters) ? listNodeValue(listFirst(g_pserver->masters)) : NULL); - - if (miFirst && miFirst->master) { - g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->master->db->id, sizeof(miFirst->master->db->id), true); - } - else if (miFirst && miFirst->cached_master) { - g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->cached_master->db->id, sizeof(miFirst->cached_master->db->id), true); + if (miFirst && miFirst->master) { + g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->master->db->id, sizeof(miFirst->master->db->id), true); + } + else if (miFirst && miFirst->cached_master) { + g_pserver->metadataDb->insert("repl-stream-db", 14, &miFirst->cached_master->db->id, sizeof(miFirst->cached_master->db->id), true); + } } if (listLength(g_pserver->masters) == 0) { diff --git a/src/server.cpp b/src/server.cpp index 8c0f9315b..2bc2f507c 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3397,7 +3397,6 @@ int restartServer(int flags, mstime_t delay) { if (flags & RESTART_SERVER_GRACEFULLY) { if (g_pserver->m_pstorageFactory) { - saveMasterStatusToStorage(true); for (int idb = 0; idb < cserver.dbnum; ++idb) { g_pserver->db[idb]->storageProviderDelete(); } @@ -4003,14 +4002,21 @@ void initServer(void) { } }); g_pserver->metadataDb->retrieve("repl-offset", 11, [&](const char *, size_t, const void *data, size_t cb){ - if (cb == sizeof(g_pserver->replid)) { + if (cb == sizeof(g_pserver->master_repl_offset)) { g_pserver->master_repl_offset = *(long long*)data; } }); + int repl_stream_db = -1; + g_pserver->metadataDb->retrieve("repl-stream-db", 14, [&](const char *, size_t, const void *data, size_t){ + repl_stream_db = *(int*)data; + }); + + /* !!! AFTER THIS POINT WE CAN NO LONGER READ FROM THE META DB AS IT WILL BE OVERWRITTEN !!! */ + // replicationCacheMasterUsingMyself triggers the overwrite + listIter li; listNode *ln; - listRewind(g_pserver->masters, &li); while ((ln = listNext(&li))) { @@ -4019,9 +4025,7 @@ void initServer(void) { * information, in order to allow partial resynchronizations * with masters. */ replicationCacheMasterUsingMyself(mi); - g_pserver->metadataDb->retrieve("repl-stream-db", 14, [&](const char *, size_t, const void *data, size_t){ - selectDb(mi->cached_master, *(int*)data); - }); + selectDb(mi->cached_master, repl_stream_db); } } } @@ -4031,6 +4035,8 @@ void initServer(void) { { g_pserver->db[idb]->storageProviderInitialize(); } + + saveMasterStatusToStorage(false); // eliminate the repl-offset field /* Initialize ACL default password if it exists */ ACLUpdateDefaultUserPassword(g_pserver->requirepass);