Skip to content

Commit ae21698

Browse files
committed
curve_ops_tool: support update chunkserver and server
1 parent a2f4b1d commit ae21698

14 files changed

+281
-2
lines changed

proto/topology.proto

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,26 @@ message GetCopySetsInClusterResponse {
508508
repeated common.CopysetInfo copysetInfos = 2;
509509
}
510510

511+
message UpdateChunkServerRequest {
512+
required uint32 chunkServerID = 1;
513+
optional string hostIp = 2;
514+
optional string externalIp = 3;
515+
}
516+
517+
message UpdateChunkServerResponse {
518+
required sint32 statusCode = 1;
519+
}
520+
521+
message UpdateServerRequest {
522+
required uint32 serverID = 1;
523+
optional string hostIp = 2;
524+
optional string externalIp = 3;
525+
}
526+
527+
message UpdateServerResponse {
528+
required sint32 statusCode = 1;
529+
}
530+
511531
//TODO(hzsunjianliang): update userPolicy and so on
512532
service TopologyService {
513533
rpc RegistChunkServer(ChunkServerRegistRequest) returns (ChunkServerRegistResponse);
@@ -548,4 +568,9 @@ service TopologyService {
548568
rpc GetCopySetsInChunkServer(GetCopySetsInChunkServerRequest) returns (GetCopySetsInChunkServerResponse);
549569
rpc GetCopySetsInCluster(GetCopySetsInClusterRequest) returns (GetCopySetsInClusterResponse);
550570
rpc GetClusterInfo(GetClusterInfoRequest) returns (GetClusterInfoResponse);
571+
572+
// ops updateserver\chunkserver
573+
rpc UpdateServer(UpdateServerRequest) returns (UpdateServerResponse);
574+
rpc UpdateChunkServer(UpdateChunkServerRequest) returns (UpdateChunkServerResponse);
575+
551576
}

src/mds/topology/topology.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,56 @@ int TopologyImpl::UpdateChunkServerVersion(const std::string &version,
14451445
return ret;
14461446
}
14471447

1448+
int TopologyImpl::UpdateChunkServer(uint32_t chunkserverId,
1449+
const std::string &hostIp,
1450+
const std::string &externalIP) {
1451+
ReadLockGuard rlockChunkServerMap(chunkServerMutex_);
1452+
auto it = chunkServerMap_.find(chunkserverId);
1453+
if (it != chunkServerMap_.end()) {
1454+
WriteLockGuard wlockChunkServer(it->second.GetRWLockRef());
1455+
ChunkServer temp = it->second;
1456+
1457+
if (!hostIp.empty() && hostIp != temp.GetHostIp()) {
1458+
temp.SetHostIp(hostIp);
1459+
}
1460+
if (!externalIP.empty() && externalIP != temp.GetExternalHostIp()) {
1461+
temp.SetExternalHostIp(externalIP);
1462+
}
1463+
1464+
if (!storage_->UpdateChunkServer(temp)) {
1465+
return kTopoErrCodeStorgeFail;
1466+
}
1467+
it->second = std::move(temp);
1468+
it->second.SetDirtyFlag(false);
1469+
return kTopoErrCodeSuccess;
1470+
} else {
1471+
return kTopoErrCodeChunkServerNotFound;
1472+
}
1473+
}
1474+
1475+
int TopologyImpl::UpdateServer(uint32_t serverId, const std::string &hostIp,
1476+
const std::string &externalIp) {
1477+
WriteLockGuard wlockServer(serverMutex_);
1478+
auto it = serverMap_.find(serverId);
1479+
if (it != serverMap_.end()) {
1480+
Server temp = it->second;
1481+
1482+
if (!hostIp.empty() && hostIp != temp.GetInternalHostIp()) {
1483+
temp.SetInternalHostIp(hostIp);
1484+
}
1485+
if (!externalIp.empty() && externalIp != temp.GetExternalHostIp()) {
1486+
temp.SetExternalHostIp(externalIp);
1487+
}
1488+
if (!storage_->UpdateServer(temp)) {
1489+
return kTopoErrCodeStorgeFail;
1490+
}
1491+
it->second = std::move(temp);
1492+
return kTopoErrCodeSuccess;
1493+
} else {
1494+
return kTopoErrCodeServerNotFound;
1495+
}
1496+
}
1497+
14481498
} // namespace topology
14491499
} // namespace mds
14501500
} // namespace curve

src/mds/topology/topology.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@ class Topology {
179179
virtual int UpdateChunkServerStartUpTime(uint64_t time,
180180
ChunkServerIdType id) = 0;
181181

182+
virtual int UpdateChunkServer(uint32_t chunkserverId,
183+
const std::string &hostIp,
184+
const std::string &externalIP) = 0;
185+
virtual int UpdateServer(uint32_t serverId, const std::string &hostIp,
186+
const std::string &externalIp) = 0;
187+
182188
/**
183189
* @brief update copyset info
184190
* @detail
@@ -660,7 +666,14 @@ class TopologyImpl : public Topology {
660666
int GetBelongPhysicalPoolIdByServerId(ServerIdType serverId,
661667
PoolIdType *physicalPoolIdOut);
662668

663-
private:
669+
int UpdateChunkServer(uint32_t chunkserverId,
670+
const std::string &hostIp,
671+
const std::string &externalIP);
672+
673+
int UpdateServer(uint32_t serverId, const std::string &hostIp,
674+
const std::string &externalIp);
675+
676+
private:
664677
int LoadClusterInfo();
665678

666679
int CleanInvalidLogicalPoolAndCopyset();

src/mds/topology/topology_item.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,14 @@ class Server {
463463
desc_ = desc;
464464
}
465465

466+
void SetInternalHostIp(const std::string &ip) {
467+
internalHostIp_ = ip;
468+
}
469+
470+
void SetExternalHostIp(const std::string &ip) {
471+
externalHostIp_ = ip;
472+
}
473+
466474
std::string GetDesc() const {
467475
return desc_;
468476
}

src/mds/topology/topology_service.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,40 @@ void TopologyServiceImpl::GetClusterInfo(
10311031
}
10321032
}
10331033

1034+
void TopologyServiceImpl::UpdateChunkServer(
1035+
google::protobuf::RpcController *cntl_base,
1036+
const UpdateChunkServerRequest *request,
1037+
UpdateChunkServerResponse *response, google::protobuf::Closure *done) {
1038+
brpc::ClosureGuard done_guard(done);
1039+
1040+
brpc::Controller* cntl =
1041+
static_cast<brpc::Controller*>(cntl_base);
1042+
1043+
LOG(INFO) << "Received request[log_id=" << cntl->log_id()
1044+
<< "] from " << cntl->remote_side()
1045+
<< " to " << cntl->local_side()
1046+
<< ". [UpdateChunkServerRequest] "
1047+
<< request->DebugString();
1048+
topology_->UpdateChunkServer(request, response);
1049+
}
1050+
1051+
void TopologyServiceImpl::UpdateServer(
1052+
google::protobuf::RpcController *cntl_base,
1053+
const UpdateServerRequest *request,
1054+
UpdateServerResponse *response, google::protobuf::Closure *done) {
1055+
brpc::ClosureGuard done_guard(done);
1056+
1057+
brpc::Controller* cntl =
1058+
static_cast<brpc::Controller*>(cntl_base);
1059+
1060+
LOG(INFO) << "Received request[log_id=" << cntl->log_id()
1061+
<< "] from " << cntl->remote_side()
1062+
<< " to " << cntl->local_side()
1063+
<< ". [UpdateServerRequest] "
1064+
<< request->DebugString();
1065+
topology_->UpdateServer(request, response);
1066+
}
1067+
10341068
} // namespace topology
10351069
} // namespace mds
10361070
} // namespace curve

src/mds/topology/topology_service.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,17 @@ class TopologyServiceImpl : public TopologyService {
210210
const GetClusterInfoRequest* request,
211211
GetClusterInfoResponse* response,
212212
google::protobuf::Closure* done);
213+
214+
virtual void UpdateChunkServer(
215+
google::protobuf::RpcController* cntl_base,
216+
const UpdateChunkServerRequest* request,
217+
UpdateChunkServerResponse* response,
218+
google::protobuf::Closure* done);
219+
virtual void UpdateServer(
220+
google::protobuf::RpcController* cntl_base,
221+
const UpdateServerRequest* request,
222+
UpdateServerResponse* response,
223+
google::protobuf::Closure* done);
213224

214225
private:
215226
std::shared_ptr<TopologyServiceManager> topology_;

src/mds/topology/topology_service_manager.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,44 @@ void TopologyServiceManager::GetClusterInfo(
17051705
}
17061706
}
17071707

1708+
void TopologyServiceManager::UpdateChunkServer(
1709+
const UpdateChunkServerRequest *request,
1710+
UpdateChunkServerResponse *response) {
1711+
std::string hostIp, externalIp;
1712+
if (request->has_hostip()) {
1713+
hostIp = request->hostip();
1714+
}
1715+
1716+
if (request->has_externalip()) {
1717+
externalIp = request->externalip();
1718+
}
1719+
1720+
int errorcode = topology_->UpdateChunkServer(request->chunkserverid(), hostIp,
1721+
externalIp);
1722+
response->set_statuscode(errorcode);
1723+
}
1724+
1725+
void TopologyServiceManager::UpdateServer(const UpdateServerRequest *request,
1726+
UpdateServerResponse *response) {
1727+
std::string hostIp, externalIp;
1728+
if (request->has_hostip()) {
1729+
hostIp = request->hostip();
1730+
}
1731+
1732+
if (request->has_externalip()) {
1733+
externalIp = request->externalip();
1734+
}
1735+
1736+
if (hostIp.empty() && externalIp.empty()) {
1737+
response->set_statuscode(kTopoErrCodeInvalidParam);
1738+
return;
1739+
}
1740+
1741+
int errorcode =
1742+
topology_->UpdateChunkServer(request->serverid(), hostIp, externalIp);
1743+
response->set_statuscode(errorcode);
1744+
}
1745+
17081746
} // namespace topology
17091747
} // namespace mds
17101748
} // namespace curve

src/mds/topology/topology_service_manager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ class TopologyServiceManager {
183183
ChunkServerIdType id,
184184
const std::vector<CopySetInfo> &copysetInfos);
185185

186+
virtual void UpdateChunkServer(const UpdateChunkServerRequest *request,
187+
UpdateChunkServerResponse *response);
188+
189+
virtual void UpdateServer(const UpdateServerRequest *request,
190+
UpdateServerResponse *response);
191+
186192
private:
187193
/**
188194
* @brief create copyset for logical pool

src/tools/curve_tool_define.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ const char kClientStatusCmd[] = "client-status";
5454
const char kClientListCmd[] = "client-list";
5555
const char kSnapshotCloneStatusCmd[] = "snapshot-clone-status";
5656
const char kClusterStatusCmd[] = "cluster-status";
57+
const char kUpdateChunkserverCmd[] = "update-chunkserver";
58+
const char kUpdateServerCmd[] = "update-server";
5759

5860
// NameSpaceTool相关命令
5961
const char kGetCmd[] = "get";

src/tools/curve_tool_main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ static const char* kHelpStr = "Usage: curve_ops_tool [Command] [OPTIONS...]\n"
5757
"check-copyset : check the health state of one copyset\n"
5858
"check-server : check the health state of the server\n"
5959
"check-operator : check the operators\n"
60+
"update-chunkserver: update chunkserver in&ex ip\n\n"
61+
"update-server: update server in&ex ip\n\n"
6062
"list-may-broken-vol: list all volumes on majority offline copysets\n"
6163
"rapid-leader-schedule: rapid leader schedule in cluster in logicalpool\n\n" //NOLINT
6264
"list-poolsets: list all poolsets in cluster\n\n"

src/tools/mds_client.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,5 +1046,47 @@ int MDSClient::ListPoolset(std::vector<PoolsetInfo>* poolsets) {
10461046
return -1;
10471047
}
10481048

1049+
int MDSClient::UpdateChunkServer(uint32_t chunkserverId,
1050+
const std::string &internalIp,
1051+
const std::string &externalIp) {
1052+
curve::mds::topology::UpdateChunkServerRequest request;
1053+
curve::mds::topology::UpdateChunkServerResponse response;
1054+
curve::mds::topology::TopologyService_Stub stub(&channel_);
1055+
1056+
auto fp = &curve::mds::topology::TopologyService_Stub::UpdateChunkServer;
1057+
if (0 != SendRpcToMds(&request, &response, &stub, fp)) {
1058+
std::cout << "UpdateChunkServer fail" << std::endl;
1059+
return -1;
1060+
}
1061+
1062+
if (response.statuscode() == curve::mds::topology::kTopoErrCodeSuccess) {
1063+
return 0;
1064+
}
1065+
1066+
std::cout << "UpdateChunkServer fail with errCode: " << response.statuscode()
1067+
<< std::endl;
1068+
return -1;
1069+
}
1070+
1071+
int MDSClient::UpdateServer(uint32_t serverId, const std::string &internalIp,
1072+
const std::string &externalIp) {
1073+
curve::mds::topology::UpdateServerRequest request;
1074+
curve::mds::topology::UpdateServerResponse response;
1075+
curve::mds::topology::TopologyService_Stub stub(&channel_);
1076+
auto fp = &curve::mds::topology::TopologyService_Stub::UpdateServer;
1077+
if (0 != SendRpcToMds(&request, &response, &stub, fp)) {
1078+
std::cout << "UpdateServer fail" << std::endl;
1079+
return -1;
1080+
}
1081+
1082+
if (response.statuscode() == curve::mds::topology::kTopoErrCodeSuccess) {
1083+
return 0;
1084+
}
1085+
1086+
std::cout << "UpdateServer fail with errCode: " << response.statuscode()
1087+
<< std::endl;
1088+
return -1;
1089+
}
1090+
10491091
} // namespace tool
10501092
} // namespace curve

src/tools/mds_client.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,12 @@ class MDSClient {
440440

441441
int ListPoolset(std::vector<PoolsetInfo>* poolsets);
442442

443+
444+
int UpdateChunkServer(uint32_t chunkserverId, const std::string& internalIp,
445+
const std::string& externalIp);
446+
int UpdateServer(uint32_t serverId, const std::string& internalIp,
447+
const std::string& externalIp);
448+
443449
private:
444450
/**
445451
* @brief 切换mds

0 commit comments

Comments
 (0)