Skip to content

Commit

Permalink
fix create space on empty hosts (#2967)
Browse files Browse the repository at this point in the history
  • Loading branch information
darionyaphet authored Sep 29, 2021
1 parent acba910 commit ddbad22
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 4 deletions.
18 changes: 15 additions & 3 deletions src/meta/processors/parts/CreateSpaceProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,12 @@ void CreateSpaceProcessor::process(const cpp2::CreateSpaceReq& req) {
}

auto partHosts = std::move(partHostsRet).value();
if (partHosts.empty()) {
LOG(ERROR) << "Pick hosts is empty.";
handleErrorCode(nebula::cpp2::ErrorCode::E_INVALID_PARM);
onFinished();
return;
}

std::stringstream ss;
for (const auto& host : partHosts) {
Expand Down Expand Up @@ -281,6 +287,7 @@ StatusOr<Hosts> CreateSpaceProcessor::pickHostsWithZone(
const std::vector<std::string>& zones,
const std::unordered_map<std::string, Hosts>& zoneHosts) {
Hosts pickedHosts;
nebula::cpp2::ErrorCode code = nebula::cpp2::ErrorCode::SUCCEEDED;
for (auto iter = zoneHosts.begin(); iter != zoneHosts.end(); iter++) {
auto zoneIter = std::find(std::begin(zones), std::end(zones), iter->first);
if (zoneIter == std::end(zones)) {
Expand All @@ -293,9 +300,8 @@ StatusOr<Hosts> CreateSpaceProcessor::pickHostsWithZone(
auto hostIter = hostLoading_.find(host);
if (hostIter == hostLoading_.end()) {
LOG(ERROR) << "Host " << host << " not found";
handleErrorCode(nebula::cpp2::ErrorCode::E_NO_HOSTS);
onFinished();
return Status::Error("Host not found");
code = nebula::cpp2::ErrorCode::E_NO_HOSTS;
break;
}

if (size > hostIter->second) {
Expand All @@ -307,6 +313,12 @@ StatusOr<Hosts> CreateSpaceProcessor::pickHostsWithZone(
hostLoading_[picked] += 1;
pickedHosts.emplace_back(toThriftHost(std::move(picked)));
}

if (code != nebula::cpp2::ErrorCode::SUCCEEDED) {
handleErrorCode(code);
onFinished();
return Status::Error("Host not found");
}
return pickedHosts;
}

Expand Down
53 changes: 52 additions & 1 deletion src/meta/test/ProcessorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "meta/processors/zone/ListGroupsProcessor.h"
#include "meta/processors/zone/ListZonesProcessor.h"
#include "meta/processors/zone/UpdateGroupProcessor.h"
#include "meta/processors/zone/UpdateZoneProcessor.h"
#include "meta/test/TestUtils.h"

DECLARE_int32(expired_threshold_sec);
Expand Down Expand Up @@ -471,7 +472,7 @@ TEST(ProcessorTest, SpaceWithGroupTest) {
fs::TempDir rootPath("/tmp/SpaceWithGroupTest.XXXXXX");
std::unique_ptr<kvstore::KVStore> kv(MockCluster::initMetaKV(rootPath.path()));
std::vector<HostAddr> addresses;
for (int32_t i = 0; i < 10; i++) {
for (int32_t i = 0; i <= 10; i++) {
addresses.emplace_back(std::to_string(i), i);
}
TestUtils::createSomeHosts(kv.get(), std::move(addresses));
Expand Down Expand Up @@ -707,6 +708,56 @@ TEST(ProcessorTest, SpaceWithGroupTest) {
auto resp = std::move(f).get();
ASSERT_EQ(nebula::cpp2::ErrorCode::E_GROUP_NOT_FOUND, resp.get_code());
}
// Create space on empty zone
{
{
std::vector<HostAddr> nodes = {HostAddr("10", 10)};
cpp2::AddZoneReq req;
req.set_zone_name("zone_5");
req.set_nodes(std::move(nodes));
auto* processor = AddZoneProcessor::instance(kv.get());
auto f = processor->getFuture();
processor->process(req);
auto resp = std::move(f).get();
ASSERT_EQ(nebula::cpp2::ErrorCode::SUCCEEDED, resp.get_code());
}
{
cpp2::AddGroupReq req;
req.set_group_name("group_2");
std::vector<std::string> zones = {"zone_5"};
req.set_zone_names(std::move(zones));
auto* processor = AddGroupProcessor::instance(kv.get());
auto f = processor->getFuture();
processor->process(req);
auto resp = std::move(f).get();
ASSERT_EQ(nebula::cpp2::ErrorCode::SUCCEEDED, resp.get_code());
}
{
cpp2::DropHostFromZoneReq req;
req.set_zone_name("zone_5");
HostAddr node{"10", 10};
req.set_node(std::move(node));
auto* processor = DropHostFromZoneProcessor::instance(kv.get());
auto f = processor->getFuture();
processor->process(req);
auto resp = std::move(f).get();
ASSERT_EQ(nebula::cpp2::ErrorCode::SUCCEEDED, resp.get_code());
}
{
cpp2::SpaceDesc properties;
properties.set_space_name("space_on_empty_hosts");
properties.set_partition_num(1);
properties.set_replica_factor(1);
properties.set_group_name("group_2");
cpp2::CreateSpaceReq req;
req.set_properties(std::move(properties));
auto* processor = CreateSpaceProcessor::instance(kv.get());
auto f = processor->getFuture();
processor->process(req);
auto resp = std::move(f).get();
ASSERT_EQ(nebula::cpp2::ErrorCode::E_INVALID_PARM, resp.get_code());
}
}
} // namespace nebula

TEST(ProcessorTest, CreateTagTest) {
Expand Down

0 comments on commit ddbad22

Please sign in to comment.