diff --git a/src/clients/meta/MetaClient.cpp b/src/clients/meta/MetaClient.cpp index db75a884c8f..0e4fb05d239 100644 --- a/src/clients/meta/MetaClient.cpp +++ b/src/clients/meta/MetaClient.cpp @@ -859,6 +859,10 @@ Status MetaClient::handleResponse(const RESP& resp) { return Status::Error("Invalid param!"); case nebula::cpp2::ErrorCode::E_WRONGCLUSTER: return Status::Error("Wrong cluster!"); + case nebula::cpp2::ErrorCode::E_ZONE_NOT_ENOUGH: + return Status::Error("Zone not enough!"); + case nebula::cpp2::ErrorCode::E_ZONE_IS_EMPTY: + return Status::Error("Zone is empty!"); case nebula::cpp2::ErrorCode::E_STORE_FAILURE: return Status::Error("Store failure!"); case nebula::cpp2::ErrorCode::E_STORE_SEGMENT_ILLEGAL: diff --git a/src/common/graph/Response.h b/src/common/graph/Response.h index dab1d00dbf3..ee7c0165bdd 100644 --- a/src/common/graph/Response.h +++ b/src/common/graph/Response.h @@ -75,6 +75,8 @@ X(E_CONFLICT, -2008) \ X(E_INVALID_PARM, -2009) \ X(E_WRONGCLUSTER, -2010) \ + X(E_ZONE_NOT_ENOUGH, -2011) \ + X(E_ZONE_IS_EMPTY, -2012) \ \ X(E_STORE_FAILURE, -2021) \ X(E_STORE_SEGMENT_ILLEGAL, -2022) \ diff --git a/src/interface/common.thrift b/src/interface/common.thrift index d21f704027a..3075f3bd051 100644 --- a/src/interface/common.thrift +++ b/src/interface/common.thrift @@ -358,6 +358,8 @@ enum ErrorCode { E_CONFLICT = -2008, E_INVALID_PARM = -2009, E_WRONGCLUSTER = -2010, + E_ZONE_NOT_ENOUGH = -2011, + E_ZONE_IS_EMPTY = -2012, E_STORE_FAILURE = -2021, E_STORE_SEGMENT_ILLEGAL = -2022, diff --git a/src/meta/processors/parts/CreateSpaceProcessor.cpp b/src/meta/processors/parts/CreateSpaceProcessor.cpp index a2b3b0cf396..40ee13b1854 100644 --- a/src/meta/processors/parts/CreateSpaceProcessor.cpp +++ b/src/meta/processors/parts/CreateSpaceProcessor.cpp @@ -146,7 +146,7 @@ void CreateSpaceProcessor::process(const cpp2::CreateSpaceReq& req) { int32_t zoneNum = zones.size(); if (replicaFactor > zoneNum) { LOG(ERROR) << "Replication number should less than or equal to zone number."; - handleErrorCode(nebula::cpp2::ErrorCode::E_INVALID_PARM); + handleErrorCode(nebula::cpp2::ErrorCode::E_ZONE_NOT_ENOUGH); onFinished(); return; } @@ -234,16 +234,16 @@ void CreateSpaceProcessor::process(const cpp2::CreateSpaceReq& req) { auto pickedZones = std::move(pickedZonesRet).value(); auto partHostsRet = pickHostsWithZone(pickedZones, zoneHosts); - if (!partHostsRet.ok()) { + if (!nebula::ok(partHostsRet)) { LOG(ERROR) << "Pick hosts with zone failed."; - code = nebula::cpp2::ErrorCode::E_INVALID_PARM; + code = nebula::error(partHostsRet); break; } - auto partHosts = std::move(partHostsRet).value(); + auto partHosts = nebula::value(partHostsRet); if (partHosts.empty()) { LOG(ERROR) << "Pick hosts is empty."; - code = nebula::cpp2::ErrorCode::E_INVALID_PARM; + code = nebula::cpp2::ErrorCode::E_NO_HOSTS; break; } @@ -268,19 +268,15 @@ void CreateSpaceProcessor::process(const cpp2::CreateSpaceReq& req) { LOG(INFO) << "Create space " << spaceName; } -StatusOr CreateSpaceProcessor::pickHostsWithZone( +ErrorOr CreateSpaceProcessor::pickHostsWithZone( const std::vector& zones, const std::unordered_map& zoneHosts) { Hosts pickedHosts; nebula::cpp2::ErrorCode code = nebula::cpp2::ErrorCode::SUCCEEDED; for (auto iter = zoneHosts.begin(); iter != zoneHosts.end(); iter++) { - if (code != nebula::cpp2::ErrorCode::SUCCEEDED) { - break; - } - if (iter->second.empty()) { LOG(ERROR) << "Zone " << iter->first << " is empty"; - code = nebula::cpp2::ErrorCode::E_INVALID_PARM; + code = nebula::cpp2::ErrorCode::E_ZONE_IS_EMPTY; break; } @@ -305,12 +301,13 @@ StatusOr CreateSpaceProcessor::pickHostsWithZone( } } + CHECK_CODE_AND_BREAK(); hostLoading_[picked] += 1; pickedHosts.emplace_back(toThriftHost(std::move(picked))); } if (code != nebula::cpp2::ErrorCode::SUCCEEDED) { - return Status::Error("Host not found"); + return code; } return pickedHosts; } diff --git a/src/meta/processors/parts/CreateSpaceProcessor.h b/src/meta/processors/parts/CreateSpaceProcessor.h index 67768039dbb..b52ab4ac958 100644 --- a/src/meta/processors/parts/CreateSpaceProcessor.h +++ b/src/meta/processors/parts/CreateSpaceProcessor.h @@ -26,8 +26,9 @@ class CreateSpaceProcessor : public BaseProcessor { : BaseProcessor(kvstore) {} // Get the host with the least load in the zone - StatusOr pickHostsWithZone(const std::vector& zones, - const std::unordered_map& zoneHosts); + ErrorOr pickHostsWithZone( + const std::vector& zones, + const std::unordered_map& zoneHosts); // Get the zones with the least load StatusOr> pickLightLoadZones(int32_t replicaFactor); diff --git a/src/meta/test/ProcessorTest.cpp b/src/meta/test/ProcessorTest.cpp index 7e7f5c3edad..559872ae3b4 100644 --- a/src/meta/test/ProcessorTest.cpp +++ b/src/meta/test/ProcessorTest.cpp @@ -3295,7 +3295,7 @@ TEST(ProcessorTest, DropHostsTest) { auto f = processor->getFuture(); processor->process(req); auto resp = std::move(f).get(); - ASSERT_EQ(nebula::cpp2::ErrorCode::E_INVALID_PARM, resp.get_code()); + ASSERT_EQ(nebula::cpp2::ErrorCode::E_ZONE_NOT_ENOUGH, resp.get_code()); } { cpp2::AddHostsIntoZoneReq req; @@ -3432,7 +3432,7 @@ TEST(ProcessorTest, DropHostsTest) { auto f = processor->getFuture(); processor->process(req); auto resp = std::move(f).get(); - ASSERT_EQ(nebula::cpp2::ErrorCode::E_INVALID_PARM, resp.get_code()); + ASSERT_EQ(nebula::cpp2::ErrorCode::E_ZONE_NOT_ENOUGH, resp.get_code()); } { // Drop hosts which hold partition.