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