diff --git a/conanfile.py b/conanfile.py index 6ae16c1b1..b9718284d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -9,7 +9,7 @@ class HomestoreConan(ConanFile): name = "homestore" - version = "6.6.24" + version = "6.6.26" homepage = "https://github.com/eBay/Homestore" description = "HomeStore Storage Engine" diff --git a/src/include/homestore/replication/repl_decls.h b/src/include/homestore/replication/repl_decls.h index 83f806c40..a161a46c2 100644 --- a/src/include/homestore/replication/repl_decls.h +++ b/src/include/homestore/replication/repl_decls.h @@ -78,6 +78,7 @@ struct peer_info { uint64_t replication_idx_; // The elapsed time since the last successful response from this peer, set to 0 on leader uint64_t last_succ_resp_us_; + bool is_new_joiner{false}; }; struct replica_member_info { diff --git a/src/lib/replication/repl_dev/raft_repl_dev.cpp b/src/lib/replication/repl_dev/raft_repl_dev.cpp index eb9fa8dc0..12da8408f 100644 --- a/src/lib/replication/repl_dev/raft_repl_dev.cpp +++ b/src/lib/replication/repl_dev/raft_repl_dev.cpp @@ -1118,9 +1118,16 @@ std::vector< peer_info > RaftReplDev::get_replication_status() const { std::vector< peer_info > pi; auto rep_status = m_repl_svc_ctx->get_raft_status(); for (auto const& pinfo : rep_status) { - pi.emplace_back(peer_info{.id_ = boost::lexical_cast< replica_id_t >(pinfo.id_), - .replication_idx_ = pinfo.last_log_idx_, - .last_succ_resp_us_ = pinfo.last_succ_resp_us_}); + auto peer = peer_info{.id_ = boost::lexical_cast< replica_id_t >(pinfo.id_), + .replication_idx_ = pinfo.last_log_idx_, + .last_succ_resp_us_ = pinfo.last_succ_resp_us_}; + auto srv_cfg = raft_server()->get_srv_config(nuraft_mesg::to_server_id(peer.id_)); + if (srv_cfg) { + peer.is_new_joiner = srv_cfg->is_new_joiner(); + } else { + RD_LOGI("server is not in the config, id={}, raft id:{}", peer.id_, nuraft_mesg::to_server_id(peer.id_)); + } + pi.emplace_back(peer); } return pi; } @@ -1152,7 +1159,7 @@ std::set< replica_id_t > RaftReplDev::get_active_peers() const { uint32_t RaftReplDev::get_blk_size() const { return data_service().get_blk_size(); } nuraft_mesg::repl_service_ctx* RaftReplDev::group_msg_service() { return m_repl_svc_ctx.get(); } -nuraft::raft_server* RaftReplDev::raft_server() { return m_repl_svc_ctx->_server; } +nuraft::raft_server* RaftReplDev::raft_server() const { return m_repl_svc_ctx->_server; } /////////////////////////////////// Config Serialize/Deserialize Section //////////////////////////////////// static nlohmann::json serialize_server_config(std::list< nuraft::ptr< nuraft::srv_config > > const& server_list) { diff --git a/src/lib/replication/repl_dev/raft_repl_dev.h b/src/lib/replication/repl_dev/raft_repl_dev.h index 46bf18b28..4b48270ee 100644 --- a/src/lib/replication/repl_dev/raft_repl_dev.h +++ b/src/lib/replication/repl_dev/raft_repl_dev.h @@ -243,7 +243,7 @@ class RaftReplDev : public ReplDev, //////////////// Accessor/shortcut methods /////////////////////// nuraft_mesg::repl_service_ctx *group_msg_service(); - nuraft::raft_server* raft_server(); + nuraft::raft_server* raft_server() const; RaftReplDevMetrics& metrics() { return m_metrics; } //////////////// Methods needed for other Raft classes to access /////////////////