diff --git a/conanfile.py b/conanfile.py index 227fe76..e2ce525 100644 --- a/conanfile.py +++ b/conanfile.py @@ -8,7 +8,7 @@ class NuRaftMesgConan(ConanFile): name = "nuraft_mesg" - version = "2.1.2" + version = "2.2.2" homepage = "https://github.com/eBay/nuraft_mesg" description = "A gRPC service for NuRAFT" diff --git a/include/nuraft_mesg/mesg_state_mgr.hpp b/include/nuraft_mesg/mesg_state_mgr.hpp index 8c3ca33..d9447bf 100644 --- a/include/nuraft_mesg/mesg_state_mgr.hpp +++ b/include/nuraft_mesg/mesg_state_mgr.hpp @@ -36,6 +36,7 @@ class repl_service_ctx { // we do not own this pointer. Use this only if the life cycle of the pointer is well known nuraft::raft_server* _server; bool is_raft_leader() const; + std::string_view raft_leader_id() const; // return a list of replica configs for the peers of the raft group void get_cluster_config(std::list< replica_config >& cluster_config) const; diff --git a/src/lib/repl_service_ctx.cpp b/src/lib/repl_service_ctx.cpp index c972b38..bd4e41b 100644 --- a/src/lib/repl_service_ctx.cpp +++ b/src/lib/repl_service_ctx.cpp @@ -64,6 +64,17 @@ repl_service_ctx::repl_service_ctx(nuraft::raft_server* server) : _server(server bool repl_service_ctx::is_raft_leader() const { return _server->is_leader(); } +std::string_view repl_service_ctx::raft_leader_id() const { + // when adding member to raft, the id recorded in raft is a hash + // of passed-in id (new_id in add_member()), the new_id was stored + // in endpoint field. + if (!_server) + return std::string_view(); + if (auto leader = _server->get_srv_config(_server->get_leader()); nullptr != leader) + return leader->get_endpoint(); + return std::string_view(); +} + void repl_service_ctx::get_cluster_config(std::list< replica_config >& cluster_config) const { auto const& srv_configs = _server->get_config()->get_servers(); for (auto const& srv_config : srv_configs) { diff --git a/src/tests/data_service_tests.cpp b/src/tests/data_service_tests.cpp index dc609e6..7bc9530 100644 --- a/src/tests/data_service_tests.cpp +++ b/src/tests/data_service_tests.cpp @@ -125,6 +125,7 @@ TEST_F(DataServiceFixture, BasicTest2) { auto repl_ctx = sm1->get_repl_context(); EXPECT_TRUE(repl_ctx && repl_ctx->is_raft_leader()); + EXPECT_TRUE(repl_ctx && repl_ctx->raft_leader_id() == to_string(app_1_->id_)); std::list< nuraft_mesg::replica_config > cluster_config; repl_ctx->get_cluster_config(cluster_config); EXPECT_EQ(cluster_config.size(), 3u);