From 1ee34dd008c436499fc30b5d2e5a0f51a75a637c Mon Sep 17 00:00:00 2001 From: Doodle <13706157+critical27@users.noreply.github.com> Date: Wed, 1 Jun 2022 16:29:21 +0800 Subject: [PATCH] fix learner's wal is not empty in rare cases (#4292) * fix learner's wal is not empty * fix lastLogTerm is not reset... confrim with sophie.xie --- src/kvstore/raftex/RaftPart.cpp | 9 +++++++++ src/kvstore/wal/FileBasedWal.cpp | 1 + 2 files changed, 10 insertions(+) diff --git a/src/kvstore/raftex/RaftPart.cpp b/src/kvstore/raftex/RaftPart.cpp index 0ab5d572601..ab57b775e1b 100644 --- a/src/kvstore/raftex/RaftPart.cpp +++ b/src/kvstore/raftex/RaftPart.cpp @@ -401,6 +401,15 @@ const char* RaftPart::roleStr(Role role) const { void RaftPart::start(std::vector&& peers, bool asLearner) { std::lock_guard g(raftLock_); + // There are some rare cases that the part start as learner, but wal is not empty. For example, + // the node is dead, and one partition is removed from raft group (majority still alive). However, + // the part is added back to raft group again as learner. So the wal may be not empty, what is + // worse, there could be case that commitLogId is 0, but wal's lastLogId is not 0, which is + // obviously not expected + if (asLearner) { + wal_->reset(); + } + lastLogId_ = wal_->lastLogId(); lastLogTerm_ = wal_->lastLogTerm(); term_ = lastLogTerm_; diff --git a/src/kvstore/wal/FileBasedWal.cpp b/src/kvstore/wal/FileBasedWal.cpp index 5b783b81d85..25a7a811b21 100644 --- a/src/kvstore/wal/FileBasedWal.cpp +++ b/src/kvstore/wal/FileBasedWal.cpp @@ -631,6 +631,7 @@ bool FileBasedWal::reset() { unlink(absFn.c_str()); } lastLogId_ = firstLogId_ = 0; + lastLogTerm_ = 0; return true; }