From 458f91d67b04fd755fd93840e812b8402578f513 Mon Sep 17 00:00:00 2001 From: CatKang Date: Fri, 5 Jan 2018 22:26:59 +0800 Subject: [PATCH] Simplify GetServerStatus to decrease lock granulartity --- floyd/src/floyd_impl.cc | 50 +++------------------------------------ floyd/src/floyd_impl.h | 1 - floyd/src/floyd_worker.cc | 6 +++-- 3 files changed, 7 insertions(+), 50 deletions(-) diff --git a/floyd/src/floyd_impl.cc b/floyd/src/floyd_impl.cc index 8d9e43a..0d06d1c 100644 --- a/floyd/src/floyd_impl.cc +++ b/floyd/src/floyd_impl.cc @@ -516,9 +516,11 @@ Status FloydImpl::GetAllServers(std::set* nodes) { bool FloydImpl::GetServerStatus(std::string* msg) { LOGV(DEBUG_LEVEL, info_log_, "FloydImpl::GetServerStatus start"); - slash::MutexLock l(&context_->global_mu); CmdResponse_ServerStatus server_status; + { + slash::MutexLock l(&context_->global_mu); DoGetServerStatus(&server_status); + } char str[512]; snprintf (str, sizeof(str), @@ -532,32 +534,6 @@ bool FloydImpl::GetServerStatus(std::string* msg) { msg->clear(); msg->append(str); - - CmdRequest cmd; - cmd.set_type(Type::kServerStatus); - CmdResponse response; - std::string local_server = slash::IpPortString(options_.local_ip, options_.local_port); - for (auto& iter : context_->members) { - if (iter != local_server) { - Status s = worker_client_pool_->SendAndRecv(iter, cmd, &response); - LOGV(DEBUG_LEVEL, info_log_, "FloydImpl::GetServerStatus Send to %s return %s", - iter.c_str(), s.ToString().c_str()); - if (s.ok()) { - std::string ip; - int port; - slash::ParseIpPortString(iter, ip, port); - CmdResponse_ServerStatus server_status = response.server_status(); - snprintf (str, sizeof(str), - "%15s:%-6d%10s%7lu%14s:%-6d%14s:%-6d%10lu%13lu%14lu%13lu\n", - ip.c_str(), port, server_status.role().c_str(), server_status.term(), - server_status.leader_ip().c_str(), server_status.leader_port(), - server_status.voted_for_ip().c_str(), server_status.voted_for_port(), - server_status.last_log_term(), server_status.last_log_index(), server_status.commit_index(), - server_status.last_applied()); - msg->append(str); - } - } - } return true; } @@ -581,26 +557,6 @@ Status FloydImpl::DoCommand(const CmdRequest& request, CmdResponse *response) { request, response); } -Status FloydImpl::ReplyExecuteDirtyCommand(const CmdRequest& cmd, - CmdResponse *response) { - std::string value; - rocksdb::Status rs; - switch (cmd.type()) { - case Type::kServerStatus: { - response->set_type(Type::kServerStatus); - response->set_code(StatusCode::kOk); - CmdResponse_ServerStatus* server_status = response->mutable_server_status(); - DoGetServerStatus(server_status); - LOGV(DEBUG_LEVEL, info_log_, "FloydImpl::ExecuteDirtyCommand GetServerStatus"); - break; - } - default: { - return Status::Corruption("Unknown cmd type"); - } - } - return Status::OK(); -} - bool FloydImpl::DoGetServerStatus(CmdResponse_ServerStatus* res) { std::string role_msg; switch (context_->role) { diff --git a/floyd/src/floyd_impl.h b/floyd/src/floyd_impl.h index 1f3d0a7..58d1387 100644 --- a/floyd/src/floyd_impl.h +++ b/floyd/src/floyd_impl.h @@ -108,7 +108,6 @@ class FloydImpl : public Floyd { Status DoCommand(const CmdRequest& cmd, CmdResponse *cmd_res); Status ExecuteCommand(const CmdRequest& cmd, CmdResponse *cmd_res); - Status ReplyExecuteDirtyCommand(const CmdRequest& cmd, CmdResponse *cmd_res); bool DoGetServerStatus(CmdResponse_ServerStatus* res); void GrantVote(uint64_t term, const std::string ip, int port); diff --git a/floyd/src/floyd_worker.cc b/floyd/src/floyd_worker.cc index 8a90e28..0f623df 100644 --- a/floyd/src/floyd_worker.cc +++ b/floyd/src/floyd_worker.cc @@ -68,9 +68,11 @@ int FloydWorkerConn::DealMessage() { floyd_->DoCommand(request_, &response_); break; case Type::kServerStatus: + response_.set_type(Type::kRead); + break; response_.set_type(Type::kServerStatus); - floyd_->ReplyExecuteDirtyCommand(request_, &response_); - response_.set_code(StatusCode::kOk); + response_.set_code(StatusCode::kError); + LOGV(WARN_LEVEL, floyd_->info_log_, "obsolete command kServerStatus"); break; case Type::kAddServer: response_.set_type(Type::kAddServer);