From c6892ea8e38ed09867aa9490176a8f87e1cb8fd2 Mon Sep 17 00:00:00 2001 From: panlei-coder Date: Wed, 5 Jun 2024 22:19:39 +0800 Subject: [PATCH 1/3] fix: fixed the learner state bug --- src/braft/raft.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/braft/raft.h b/src/braft/raft.h index f041de1c..155c9e8c 100644 --- a/src/braft/raft.h +++ b/src/braft/raft.h @@ -282,10 +282,10 @@ enum State { }; inline const char* state2str(State state) { - const char* str[] = {"LEADER", "TRANSFERRING", "CANDIDATE", "FOLLOWER", + const char* str[] = {"LEARNER", "LEADER", "TRANSFERRING", "CANDIDATE", "FOLLOWER", "ERROR", "UNINITIALIZED", "SHUTTING", "SHUTDOWN", }; if (state < STATE_END) { - return str[(int)state - 1]; + return str[(int)state]; } else { return "UNKNOWN"; } From 4931473b0963c205b3501aeb9cb8aaf7e503fde5 Mon Sep 17 00:00:00 2001 From: panlei-coder Date: Wed, 5 Jun 2024 23:08:46 +0800 Subject: [PATCH 2/3] fix: support to get list of learner peers --- src/braft/node.cpp | 9 +++++++++ src/braft/node.h | 1 + src/braft/raft.cpp | 5 +++++ src/braft/raft.h | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/braft/node.cpp b/src/braft/node.cpp index 2fb59e45..eb2d7098 100644 --- a/src/braft/node.cpp +++ b/src/braft/node.cpp @@ -903,6 +903,15 @@ butil::Status NodeImpl::list_peers(std::vector* peers) { return butil::Status::OK(); } +butil::Status NodeImpl::list_learners(std::vector* learners) { + BAIDU_SCOPED_LOCK(_mutex); + if (_state != STATE_LEADER) { + return butil::Status(EPERM, "Not leader"); + } + _learner_conf.conf.list_peers(learners); + return butil::Status::OK(); +} + void NodeImpl::add_peer(const PeerId& peer, Closure* done) { BAIDU_SCOPED_LOCK(_mutex); Configuration new_conf = _conf.conf; diff --git a/src/braft/node.h b/src/braft/node.h index 7a88db88..6eb137b4 100644 --- a/src/braft/node.h +++ b/src/braft/node.h @@ -135,6 +135,7 @@ friend class VoteBallotCtx; void apply(const Task& task); butil::Status list_peers(std::vector* peers); + butil::Status list_learners(std::vector* learners); // @Node configuration change void add_peer(const PeerId& peer, Closure* done); diff --git a/src/braft/raft.cpp b/src/braft/raft.cpp index 4724b938..3cd41e30 100644 --- a/src/braft/raft.cpp +++ b/src/braft/raft.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "braft/raft.h" #include "braft/node.h" #include "braft/storage.h" @@ -186,6 +187,10 @@ butil::Status Node::list_peers(std::vector* peers) { return _impl->list_peers(peers); } +butil::Status Node::list_learners(std::vector* learners) { + return _impl->list_learners(learners); +} + void Node::add_peer(const PeerId& peer, Closure* done) { _impl->add_peer(peer, done); } diff --git a/src/braft/raft.h b/src/braft/raft.h index 155c9e8c..2d597762 100644 --- a/src/braft/raft.h +++ b/src/braft/raft.h @@ -689,6 +689,11 @@ class Node { // because add_peer/remove_peer immediately modify configuration in memory butil::Status list_peers(std::vector* peers); + // list learner peers of this raft group, only leader retruns ok + // [NOTE] when list_learner_peers concurrency with add_learner/remove_learner, maybe return learner_peers is staled. + // because add_learner/remove_learner immediately modify configuration in memory + butil::Status list_learners(std::vector* learners); + // Add a new peer to the raft group. done->Run() would be invoked after this // operation finishes, describing the detailed result. void add_peer(const PeerId& peer, Closure* done); From 7bd918fba50f3d091000a41445d85865cf046148 Mon Sep 17 00:00:00 2001 From: panlei-coder Date: Wed, 12 Jun 2024 22:40:54 +0800 Subject: [PATCH 3/3] fix: fix comment --- src/braft/node.cpp | 15 +++++++-------- src/braft/node.h | 3 ++- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/braft/node.cpp b/src/braft/node.cpp index eb2d7098..c5c9057d 100644 --- a/src/braft/node.cpp +++ b/src/braft/node.cpp @@ -894,22 +894,21 @@ void NodeImpl::unsafe_register_conf_change(const Configuration& old_conf, return _conf_ctx.start(old_conf, new_conf, done); } -butil::Status NodeImpl::list_peers(std::vector* peers) { +butil::Status NodeImpl::list_members(std::vector* peers, const ConfigurationEntry& conf) { BAIDU_SCOPED_LOCK(_mutex); if (_state != STATE_LEADER) { return butil::Status(EPERM, "Not leader"); } - _conf.conf.list_peers(peers); + conf.conf.list_peers(peers); return butil::Status::OK(); } +butil::Status NodeImpl::list_peers(std::vector* peers) { + return list_members(peers, _conf); +} + butil::Status NodeImpl::list_learners(std::vector* learners) { - BAIDU_SCOPED_LOCK(_mutex); - if (_state != STATE_LEADER) { - return butil::Status(EPERM, "Not leader"); - } - _learner_conf.conf.list_peers(learners); - return butil::Status::OK(); + return list_members(learners, _learner_conf); } void NodeImpl::add_peer(const PeerId& peer, Closure* done) { diff --git a/src/braft/node.h b/src/braft/node.h index 6eb137b4..af5230fd 100644 --- a/src/braft/node.h +++ b/src/braft/node.h @@ -133,7 +133,8 @@ friend class VoteBallotCtx; // Otherwise we will specifit the error and call it. // void apply(const Task& task); - + + butil::Status list_members(std::vector* peers, const ConfigurationEntry& conf); butil::Status list_peers(std::vector* peers); butil::Status list_learners(std::vector* learners);