Skip to content

Commit

Permalink
Simplify GetServerStatus to decrease lock granulartity
Browse files Browse the repository at this point in the history
  • Loading branch information
CatKang committed Jan 5, 2018
1 parent d76ac91 commit 458f91d
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 50 deletions.
50 changes: 3 additions & 47 deletions floyd/src/floyd_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -516,9 +516,11 @@ Status FloydImpl::GetAllServers(std::set<std::string>* 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),
Expand All @@ -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;
}

Expand All @@ -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) {
Expand Down
1 change: 0 additions & 1 deletion floyd/src/floyd_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
6 changes: 4 additions & 2 deletions floyd/src/floyd_worker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 458f91d

Please sign in to comment.