You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pegasus.apache.org by wa...@apache.org on 2023/03/23 02:56:34 UTC
[incubator-pegasus] branch master updated: check leader status (#1406)
This is an automated email from the ASF dual-hosted git repository.
wangdan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git
The following commit(s) were added to refs/heads/master by this push:
new 169333005 check leader status (#1406)
169333005 is described below
commit 16933300569c890eaf433acffa272155f6eee9a6
Author: WHBANG <38...@users.noreply.github.com>
AuthorDate: Thu Mar 23 10:56:29 2023 +0800
check leader status (#1406)
https://github.com/apache/incubator-pegasus/issues/1405
The purpose of this patch is to make method `check_leader` return enumeration class
type(`meta_leader_state`) instead of int, to avoid making mistake.
---
src/meta/meta_service.cpp | 17 +++++++++--------
src/meta/meta_service.h | 46 +++++++++++++++++++++++++---------------------
2 files changed, 34 insertions(+), 29 deletions(-)
diff --git a/src/meta/meta_service.cpp b/src/meta/meta_service.cpp
index 05656e20d..d2f3fd00d 100644
--- a/src/meta/meta_service.cpp
+++ b/src/meta/meta_service.cpp
@@ -540,27 +540,28 @@ void meta_service::register_rpc_handlers()
&meta_service::on_set_max_replica_count);
}
-int meta_service::check_leader(dsn::message_ex *req, dsn::rpc_address *forward_address)
+meta_leader_state meta_service::check_leader(dsn::message_ex *req,
+ dsn::rpc_address *forward_address)
{
dsn::rpc_address leader;
if (!_failure_detector->get_leader(&leader)) {
if (!req->header->context.u.is_forward_supported) {
if (forward_address != nullptr)
*forward_address = leader;
- return -1;
+ return meta_leader_state::kNotLeaderAndCannotForwardRpc;
}
LOG_DEBUG("leader address: {}", leader);
if (!leader.is_invalid()) {
dsn_rpc_forward(req, leader);
- return 0;
+ return meta_leader_state::kNotLeaderAndCanForwardRpc;
} else {
if (forward_address != nullptr)
forward_address->set_invalid();
- return -1;
+ return meta_leader_state::kNotLeaderAndCannotForwardRpc;
}
}
- return 1;
+ return meta_leader_state::kIsLeader;
}
// table operations
@@ -813,13 +814,13 @@ void meta_service::on_start_recovery(configuration_recovery_rpc rpc)
{
configuration_recovery_response &response = rpc.response();
LOG_INFO("got start recovery request, start to do recovery");
- int result = check_leader(rpc, nullptr);
+ auto result = check_leader(rpc, nullptr);
// request has been forwarded to others
- if (result == 0) {
+ if (result == meta_leader_state::kNotLeaderAndCanForwardRpc) {
return;
}
- if (result == -1) {
+ if (result == meta_leader_state::kNotLeaderAndCannotForwardRpc) {
response.err = ERR_FORWARD_TO_OTHERS;
} else {
zauto_write_lock l(_meta_lock);
diff --git a/src/meta/meta_service.h b/src/meta/meta_service.h
index 9f367d76c..505b1ca81 100644
--- a/src/meta/meta_service.h
+++ b/src/meta/meta_service.h
@@ -118,6 +118,14 @@ ENUM_REG(meta_op_status::RESTORE)
ENUM_REG(meta_op_status::MANUAL_COMPACT)
ENUM_END(meta_op_status)
+// The leader status of meta server
+enum class meta_leader_state : int
+{
+ kIsLeader, // the meta is leader
+ kNotLeaderAndCanForwardRpc, // meta isn't leader, and rpc-msg can forward to others
+ kNotLeaderAndCannotForwardRpc, // meta isn't leader, and rpc-msg can't forward to others
+};
+
class meta_service : public serverlet<meta_service>
{
public:
@@ -278,15 +286,11 @@ private:
void on_get_max_replica_count(configuration_get_max_replica_count_rpc rpc);
void on_set_max_replica_count(configuration_set_max_replica_count_rpc rpc);
- // common routines
- // ret:
- // 1. the meta is leader
- // 0. meta isn't leader, and rpc-msg can forward to others
- // -1. meta isn't leader, and rpc-msg can't forward to others
- // if return -1 and `forward_address' != nullptr, then return leader by `forward_address'.
- int check_leader(dsn::message_ex *req, dsn::rpc_address *forward_address);
+ // if return 'kNotLeaderAndCannotForwardRpc' and 'forward_address' != nullptr, then return
+ // leader by 'forward_address'.
+ meta_leader_state check_leader(dsn::message_ex *req, dsn::rpc_address *forward_address);
template <typename TRpcHolder>
- int check_leader(TRpcHolder rpc, /*out*/ rpc_address *forward_address);
+ meta_leader_state check_leader(TRpcHolder rpc, /*out*/ rpc_address *forward_address);
// ret:
// false: check failed
// true: check succeed
@@ -368,27 +372,27 @@ private:
};
template <typename TRpcHolder>
-int meta_service::check_leader(TRpcHolder rpc, rpc_address *forward_address)
+meta_leader_state meta_service::check_leader(TRpcHolder rpc, rpc_address *forward_address)
{
dsn::rpc_address leader;
if (!_failure_detector->get_leader(&leader)) {
if (!rpc.dsn_request()->header->context.u.is_forward_supported) {
if (forward_address != nullptr)
*forward_address = leader;
- return -1;
+ return meta_leader_state::kNotLeaderAndCannotForwardRpc;
}
LOG_DEBUG("leader address: {}", leader);
if (!leader.is_invalid()) {
rpc.forward(leader);
- return 0;
+ return meta_leader_state::kNotLeaderAndCanForwardRpc;
} else {
if (forward_address != nullptr)
forward_address->set_invalid();
- return -1;
+ return meta_leader_state::kNotLeaderAndCannotForwardRpc;
}
}
- return 1;
+ return meta_leader_state::kIsLeader;
}
template <typename TRpcHolder>
@@ -400,11 +404,11 @@ bool meta_service::check_status(TRpcHolder rpc, rpc_address *forward_address)
return false;
}
- int result = check_leader(rpc, forward_address);
- if (result == 0)
+ auto result = check_leader(rpc, forward_address);
+ if (result == meta_leader_state::kNotLeaderAndCanForwardRpc)
return false;
- if (result == -1 || !_started) {
- if (result == -1) {
+ if (result == meta_leader_state::kNotLeaderAndCannotForwardRpc || !_started) {
+ if (result == meta_leader_state::kNotLeaderAndCannotForwardRpc) {
rpc.response().err = ERR_FORWARD_TO_OTHERS;
} else if (_recovering) {
rpc.response().err = ERR_UNDER_RECOVERY;
@@ -428,12 +432,12 @@ bool meta_service::check_status_with_msg(message_ex *req, TRespType &response_st
return false;
}
- int result = check_leader(req, nullptr);
- if (result == 0) {
+ auto result = check_leader(req, nullptr);
+ if (result == meta_leader_state::kNotLeaderAndCanForwardRpc) {
return false;
}
- if (result == -1 || !_started) {
- if (result == -1) {
+ if (result == meta_leader_state::kNotLeaderAndCannotForwardRpc || !_started) {
+ if (result == meta_leader_state::kNotLeaderAndCannotForwardRpc) {
response_struct.err = ERR_FORWARD_TO_OTHERS;
} else if (_recovering) {
response_struct.err = ERR_UNDER_RECOVERY;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pegasus.apache.org
For additional commands, e-mail: commits-help@pegasus.apache.org