From 40f8e56976b875bf3676fd0af134c41b2d6ff87f Mon Sep 17 00:00:00 2001 From: panda-sheep <59197347+panda-sheep@users.noreply.github.com> Date: Wed, 13 Apr 2022 18:07:59 +0800 Subject: [PATCH] fix show tag/edge index status (#4148) --- .../job/ListEdgeIndexStatusProcessor.cpp | 13 ++- .../job/ListTagIndexStatusProcessor.cpp | 13 ++- src/meta/test/IndexProcessorTest.cpp | 97 +++++++++++++++++++ 3 files changed, 115 insertions(+), 8 deletions(-) diff --git a/src/meta/processors/job/ListEdgeIndexStatusProcessor.cpp b/src/meta/processors/job/ListEdgeIndexStatusProcessor.cpp index b2440d31c4e..68c2fda97b5 100644 --- a/src/meta/processors/job/ListEdgeIndexStatusProcessor.cpp +++ b/src/meta/processors/job/ListEdgeIndexStatusProcessor.cpp @@ -41,9 +41,8 @@ void ListEdgeIndexStatusProcessor::process(const cpp2::ListIndexStatusReq& req) return a.get_job_id() > b.get_job_id(); }); - std::vector statuses; + std::unordered_map tmp; for (auto& jobDesc : jobs) { - cpp2::IndexStatus status; auto paras = jobDesc.get_paras(); std::string edgeIndexJobName; if (paras.empty()) { @@ -51,8 +50,14 @@ void ListEdgeIndexStatusProcessor::process(const cpp2::ListIndexStatusReq& req) } else { edgeIndexJobName = folly::join(",", paras); } - status.name_ref() = edgeIndexJobName; - status.status_ref() = apache::thrift::util::enumNameSafe(jobDesc.get_status()); + tmp.emplace(edgeIndexJobName, jobDesc.get_status()); + } + + std::vector statuses; + for (auto& kv : tmp) { + cpp2::IndexStatus status; + status.name_ref() = std::move(kv.first); + status.status_ref() = apache::thrift::util::enumNameSafe(kv.second); statuses.emplace_back(std::move(status)); } resp_.statuses_ref() = std::move(statuses); diff --git a/src/meta/processors/job/ListTagIndexStatusProcessor.cpp b/src/meta/processors/job/ListTagIndexStatusProcessor.cpp index caeca3fc1f9..2219fb96890 100644 --- a/src/meta/processors/job/ListTagIndexStatusProcessor.cpp +++ b/src/meta/processors/job/ListTagIndexStatusProcessor.cpp @@ -42,9 +42,8 @@ void ListTagIndexStatusProcessor::process(const cpp2::ListIndexStatusReq& req) { return a.get_job_id() > b.get_job_id(); }); - std::vector statuses; + std::unordered_map tmp; for (auto& jobDesc : jobs) { - cpp2::IndexStatus status; auto paras = jobDesc.get_paras(); std::string tagIndexJobName; if (paras.empty()) { @@ -52,8 +51,14 @@ void ListTagIndexStatusProcessor::process(const cpp2::ListIndexStatusReq& req) { } else { tagIndexJobName = folly::join(",", paras); } - status.name_ref() = tagIndexJobName; - status.status_ref() = apache::thrift::util::enumNameSafe(jobDesc.get_status()); + tmp.emplace(tagIndexJobName, jobDesc.get_status()); + } + + std::vector statuses; + for (auto& kv : tmp) { + cpp2::IndexStatus status; + status.name_ref() = std::move(kv.first); + status.status_ref() = apache::thrift::util::enumNameSafe(kv.second); statuses.emplace_back(std::move(status)); } resp_.statuses_ref() = std::move(statuses); diff --git a/src/meta/test/IndexProcessorTest.cpp b/src/meta/test/IndexProcessorTest.cpp index ad07bda6d2c..4ee6a750077 100644 --- a/src/meta/test/IndexProcessorTest.cpp +++ b/src/meta/test/IndexProcessorTest.cpp @@ -16,6 +16,8 @@ #include "meta/processors/index/GetTagIndexProcessor.h" #include "meta/processors/index/ListEdgeIndexesProcessor.h" #include "meta/processors/index/ListTagIndexesProcessor.h" +#include "meta/processors/job/ListEdgeIndexStatusProcessor.h" +#include "meta/processors/job/ListTagIndexStatusProcessor.h" #include "meta/processors/parts/CreateSpaceProcessor.h" #include "meta/processors/schema/AlterEdgeProcessor.h" #include "meta/processors/schema/AlterTagProcessor.h" @@ -2349,6 +2351,101 @@ TEST(ProcessorTest, IndexIdInSpaceRangeTest) { ASSERT_EQ(14, resp.get_id().get_index_id()); } } + +// Check list tag index status +TEST(IndexProcessorTest, ListTagIndexStatusTest) { + fs::TempDir rootPath("/tmp/ListTagIndexStatusTest.XXXXXX"); + std::unique_ptr kv(MockCluster::initMetaKV(rootPath.path())); + TestUtils::createSomeHosts(kv.get()); + GraphSpaceID spaceId = 1; + TestUtils::assembleSpace(kv.get(), spaceId, 1); + std::vector data; + + for (JobID jobId = 1; jobId < 3; jobId++) { + auto jobKey = MetaKeyUtils::jobKey(spaceId, jobId); + std::vector paras{"tag_index_name"}; + cpp2::JobStatus jstatus; + if (jobId == 1) { + jstatus = cpp2::JobStatus::FAILED; + } else { + jstatus = cpp2::JobStatus::FINISHED; + } + auto jobVal = MetaKeyUtils::jobVal( + cpp2::JobType::REBUILD_TAG_INDEX, paras, jstatus, 1, 2, nebula::cpp2::ErrorCode::SUCCEEDED); + data.emplace_back(std::move(jobKey), std::move(jobVal)); + } + folly::Baton baton; + auto ret = nebula::cpp2::ErrorCode::SUCCEEDED; + kv->asyncMultiPut( + kDefaultSpaceId, kDefaultPartId, std::move(data), [&](nebula::cpp2::ErrorCode code) { + ret = code; + baton.post(); + }); + baton.wait(); + ASSERT_EQ(ret, nebula::cpp2::ErrorCode::SUCCEEDED); + + // Allow to create edge index on no fields + cpp2::ListIndexStatusReq req; + req.space_id_ref() = 1; + auto* processor = ListTagIndexStatusProcessor::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()); + auto statuses = resp.get_statuses(); + ASSERT_EQ(statuses.size(), 1); + ASSERT_TRUE(!(statuses[0].get_status().compare("FINISHED"))); +} + +// Check list edge index status +TEST(IndexProcessorTest, ListEdgeIndexStatusTest) { + fs::TempDir rootPath("/tmp/ListEdgeIndexStatusTest.XXXXXX"); + std::unique_ptr kv(MockCluster::initMetaKV(rootPath.path())); + TestUtils::createSomeHosts(kv.get()); + GraphSpaceID spaceId = 1; + TestUtils::assembleSpace(kv.get(), spaceId, 1); + std::vector data; + + for (JobID jobId = 1; jobId < 3; jobId++) { + auto jobKey = MetaKeyUtils::jobKey(spaceId, jobId); + std::vector paras{"edge_index_name"}; + cpp2::JobStatus jstatus; + if (jobId == 1) { + jstatus = cpp2::JobStatus::FAILED; + } else { + jstatus = cpp2::JobStatus::FINISHED; + } + auto jobVal = MetaKeyUtils::jobVal(cpp2::JobType::REBUILD_EDGE_INDEX, + paras, + jstatus, + 1, + 2, + nebula::cpp2::ErrorCode::SUCCEEDED); + data.emplace_back(std::move(jobKey), std::move(jobVal)); + } + folly::Baton baton; + auto ret = nebula::cpp2::ErrorCode::SUCCEEDED; + kv->asyncMultiPut( + kDefaultSpaceId, kDefaultPartId, std::move(data), [&](nebula::cpp2::ErrorCode code) { + ret = code; + baton.post(); + }); + baton.wait(); + ASSERT_EQ(ret, nebula::cpp2::ErrorCode::SUCCEEDED); + + // Allow to create edge index on no fields + cpp2::ListIndexStatusReq req; + req.space_id_ref() = 1; + auto* processor = ListEdgeIndexStatusProcessor::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()); + auto statuses = resp.get_statuses(); + ASSERT_EQ(statuses.size(), 1); + ASSERT_TRUE(!(statuses[0].get_status().compare("FINISHED"))); +} + } // namespace meta } // namespace nebula