diff --git a/src/executor/QueryStorageExecutor.h b/src/executor/QueryStorageExecutor.h
index 158aa18cbc4d6bedc52c85955ae971b72e732221..3526d7fca15e4adb3d153f74cf1cd479833884fd 100644
--- a/src/executor/QueryStorageExecutor.h
+++ b/src/executor/QueryStorageExecutor.h
@@ -34,50 +34,60 @@ protected:
<< it->first;
}
if (completeness == 0 || isCompleteRequire) {
- LOG(ERROR) << "Request to storage failed in executor `" << name_ << "'";
- return Status::Error("Request to storage failed in executor.");
+ return handleErrorCode(failedCodes.begin()->second,
+ failedCodes.begin()->first);
}
return Result::State::kPartialSuccess;
}
return Result::State::kSuccess;
}
- Status handleErrorCode(nebula::storage::cpp2::ErrorCode code, PartitionID partId) {
+ Status handleErrorCode(nebula::storage::cpp2::ErrorCode code, PartitionID partId) const {
switch (code) {
case storage::cpp2::ErrorCode::E_INVALID_VID:
- return Status::Error("Invalid vid.");
+ return Status::Error("Storage Error: Invalid vid.");
case storage::cpp2::ErrorCode::E_INVALID_FIELD_VALUE: {
- std::string error = "Invalid field value: may be the filed is not NULL "
- "or without default value or wrong schema.";
+ std::string error = "Storage Error: Invalid field value: "
+ "may be the filed is not NULL "
+ "or without default value or wrong schema.";
return Status::Error(std::move(error));
}
+ case storage::cpp2::ErrorCode::E_LEADER_CHANGED:
+ return Status::Error("Storage Error: Leader changed.");
case storage::cpp2::ErrorCode::E_INVALID_FILTER:
- return Status::Error("Invalid filter.");
+ return Status::Error("Storage Error: Invalid filter.");
case storage::cpp2::ErrorCode::E_INVALID_UPDATER:
- return Status::Error("Invalid Update col or yield col.");
+ return Status::Error("Storage Error: Invalid Update col or yield col.");
+ case storage::cpp2::ErrorCode::E_INVALID_SPACEVIDLEN:
+ return Status::Error("Storage Error: Invalid space vid len.");
+ case storage::cpp2::ErrorCode::E_SPACE_NOT_FOUND:
+ return Status::Error("Storage Error: Space not found.");
case storage::cpp2::ErrorCode::E_TAG_NOT_FOUND:
- return Status::Error("Tag not found.");
+ return Status::Error("Storage Error: Tag not found.");
case storage::cpp2::ErrorCode::E_TAG_PROP_NOT_FOUND:
- return Status::Error("Tag prop not found.");
+ return Status::Error("Storage Error: Tag prop not found.");
case storage::cpp2::ErrorCode::E_EDGE_NOT_FOUND:
- return Status::Error("Edge not found.");
+ return Status::Error("Storage Error: Edge not found.");
case storage::cpp2::ErrorCode::E_EDGE_PROP_NOT_FOUND:
- return Status::Error("Edge prop not found.");
+ return Status::Error("Storage Error: Edge prop not found.");
+ case storage::cpp2::ErrorCode::E_INDEX_NOT_FOUND:
+ return Status::Error("Storage Error: Index not found.");
case storage::cpp2::ErrorCode::E_INVALID_DATA:
- return Status::Error("Invalid data, may be wrong value type.");
+ return Status::Error("Storage Error: Invalid data, may be wrong value type.");
case storage::cpp2::ErrorCode::E_NOT_NULLABLE:
- return Status::Error("The not null field cannot be null.");
+ return Status::Error("Storage Error: The not null field cannot be null.");
case storage::cpp2::ErrorCode::E_FIELD_UNSET:
- return Status::Error("The not null field doesn't have a default value.");
+ return Status::Error("Storage Error: "
+ "The not null field doesn't have a default value.");
case storage::cpp2::ErrorCode::E_OUT_OF_RANGE:
- return Status::Error("Out of range value.");
+ return Status::Error("Storage Error: Out of range value.");
case storage::cpp2::ErrorCode::E_ATOMIC_OP_FAILED:
- return Status::Error("Atomic operation failed.");
+ return Status::Error("Storage Error: Atomic operation failed.");
case storage::cpp2::ErrorCode::E_FILTER_OUT:
return Status::OK();
default:
- auto status = Status::Error("Unknown error, part: %d, error code: %d.",
- partId, static_cast<int32_t>(code));
+ auto status = Status::Error("Storage Error: part: %d, error code: %d.",
+ partId, static_cast<int32_t>(code));
LOG(ERROR) << status;
return status;
}
diff --git a/src/mock/CMakeLists.txt b/src/mock/CMakeLists.txt
deleted file mode 100644
index 3fa18b6e3f65ccf704751dc20ca20276777f752a..0000000000000000000000000000000000000000
--- a/src/mock/CMakeLists.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (c) 2020 vesoft inc. All rights reserved.
-#
-# This source code is licensed under Apache 2.0 License,
-# attached with Common Clause Condition 1.0, found in the LICENSES directory.
-#
-
-nebula_add_library(
- mock_obj OBJECT
- MetaCache.cpp
- StorageCache.cpp
- MockMetaServiceHandler.cpp
- MockStorageServiceHandler.cpp
- test/TestMain.cpp
- test/TestEnv.cpp
- test/TestBase.cpp
-)
-
-# nebula_add_subdirectory(test)
diff --git a/src/mock/MetaCache.cpp b/src/mock/MetaCache.cpp
deleted file mode 100644
index d04a2b2bc08f3bb126a935131782215314c79dcc..0000000000000000000000000000000000000000
--- a/src/mock/MetaCache.cpp
+++ /dev/null
@@ -1,947 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "mock/MetaCache.h"
-#include "MetaCache.h"
-#include "common/network/NetworkUtils.h"
-
-namespace nebula {
-namespace graph {
-
-#define CHECK_SPACE_ID(spaceId) \
- auto spaceIter = cache_.find(spaceId); \
- if (spaceIter == cache_.end()) { \
- return Status::Error("SpaceID `%d' not found", spaceId); \
- }
-
-Status MetaCache::createSpace(const meta::cpp2::CreateSpaceReq &req, GraphSpaceID &spaceId) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto ifNotExists = req.get_if_not_exists();
- auto properties = req.get_properties();
- auto spaceName = properties.get_space_name();
- const auto findIter = spaceIndex_.find(spaceName);
- if (ifNotExists && findIter != spaceIndex_.end()) {
- spaceId = findIter->second;
- return Status::OK();
- }
- if (findIter != spaceIndex_.end()) {
- return Status::Error("Space `%s' existed", spaceName.c_str());
- }
- spaceId = ++id_;
- spaceIndex_.emplace(spaceName, spaceId);
- meta::cpp2::SpaceItem space;
- space.set_space_id(spaceId);
- space.set_properties(std::move(properties));
- spaces_[spaceId] = space;
- auto &vid = space.get_properties().get_vid_type();
- auto vidSize = vid.__isset.type_length ? *vid.get_type_length() : 0;
- VLOG(1) << "space name: " << space.get_properties().get_space_name()
- << ", partition_num: " << space.get_properties().get_partition_num()
- << ", replica_factor: " << space.get_properties().get_replica_factor()
- << ", vid_size: " << vidSize;
- cache_[spaceId] = SpaceInfoCache();
- roles_.emplace(spaceId, UserRoles());
- return Status::OK();
-}
-
-StatusOr<meta::cpp2::SpaceItem> MetaCache::getSpace(const meta::cpp2::GetSpaceReq &req) {
- folly::RWSpinLock::ReadHolder holder(lock_);
- auto findIter = spaceIndex_.find(req.get_space_name());
- if (findIter == spaceIndex_.end()) {
- LOG(ERROR) << "Space " << req.get_space_name().c_str() << " not found";
- return Status::Error("Space `%s' not found", req.get_space_name().c_str());
- }
- const auto spaceInfo = spaces_.find(findIter->second);
- DCHECK(spaceInfo != spaces_.end());
- auto &properties = spaceInfo->second.get_properties();
- auto& vid = properties.get_vid_type();
- VLOG(1) << "space name: " << properties.get_space_name()
- << ", partition_num: " << properties.get_partition_num()
- << ", replica_factor: " << properties.get_replica_factor()
- << ", vid_size: " << (vid.__isset.type_length ? *vid.get_type_length() : 0);
- return spaceInfo->second;
-}
-
-StatusOr<std::vector<meta::cpp2::IdName>> MetaCache::listSpaces() {
- folly::RWSpinLock::ReadHolder holder(lock_);
- std::vector<meta::cpp2::IdName> spaces;
- for (const auto &index : spaceIndex_) {
- meta::cpp2::IdName idName;
- idName.set_id(to(index.second, EntryType::SPACE));
- idName.set_name(index.first);
- spaces.emplace_back(idName);
- }
- return spaces;
-}
-
-Status MetaCache::dropSpace(const meta::cpp2::DropSpaceReq &req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto spaceName = req.get_space_name();
- auto findIter = spaceIndex_.find(spaceName);
- auto ifExists = req.get_if_exists();
-
- if (ifExists && findIter == spaceIndex_.end()) {
- Status::OK();
- }
-
- if (findIter == spaceIndex_.end()) {
- return Status::Error("Space `%s' not existed", req.get_space_name().c_str());
- }
- auto id = findIter->second;
- spaces_.erase(id);
- cache_.erase(id);
- roles_.erase(id);
- spaceIndex_.erase(spaceName);
- return Status::OK();
-}
-
-Status MetaCache::createTag(const meta::cpp2::CreateTagReq &req, TagID &tagId) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifNotExists = req.get_if_not_exists();
- auto tagName = req.get_tag_name();
- auto &tagSchemas = spaceIter->second.tagSchemas_;
- auto findIter = tagSchemas.find(tagName);
- if (ifNotExists && findIter != tagSchemas.end()) {
- tagId = findIter->second.get_tag_id();
- return Status::OK();
- }
-
- tagId = ++id_;
- meta::cpp2::TagItem tagItem;
- tagItem.set_tag_id(tagId);
- tagItem.set_tag_name(tagName);
- tagItem.set_version(0);
- tagItem.set_schema(req.get_schema());
- tagSchemas[tagName] = std::move(tagItem);
- return Status::OK();
-}
-
-StatusOr<meta::cpp2::Schema> MetaCache::getTag(const meta::cpp2::GetTagReq &req) {
- folly::RWSpinLock::ReadHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto tagName = req.get_tag_name();
- auto &tagSchemas = spaceIter->second.tagSchemas_;
- auto findIter = tagSchemas.find(tagName);
- if (findIter == tagSchemas.end()) {
- LOG(ERROR) << "Tag name: " << tagName << " not found";
- return Status::Error("Not found");
- }
- return findIter->second.get_schema();
-}
-
-StatusOr<std::vector<meta::cpp2::TagItem>>
-MetaCache::listTags(const meta::cpp2::ListTagsReq &req) {
- folly::RWSpinLock::ReadHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- std::vector<meta::cpp2::TagItem> tagItems;
- for (const auto& item : spaceIter->second.tagSchemas_) {
- tagItems.emplace_back(item.second);
- }
- return tagItems;
-}
-
-Status MetaCache::dropTag(const meta::cpp2::DropTagReq& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifExists = req.get_if_exists();
- auto tagName = req.get_tag_name();
- auto &tagSchemas = spaceIter->second.tagSchemas_;
- auto findIter = tagSchemas.find(tagName);
- if (ifExists && findIter == tagSchemas.end()) {
- return Status::OK();
- }
- if (findIter == tagSchemas.end()) {
- return Status::Error("Tag `%s' not existed", req.get_tag_name().c_str());
- }
-
- tagSchemas.erase(findIter);
- return Status::OK();
-}
-
-Status MetaCache::createEdge(const meta::cpp2::CreateEdgeReq &req, EdgeType &edgeType) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifNotExists = req.get_if_not_exists();
- auto edgeName = req.get_edge_name();
- auto &edgeSchemas = spaceIter->second.edgeSchemas_;
- auto findIter = edgeSchemas.find(edgeName);
- if (ifNotExists && findIter != edgeSchemas.end()) {
- edgeType = findIter->second.get_edge_type();
- return Status::OK();
- }
-
- edgeType = ++id_;
- meta::cpp2::EdgeItem edgeItem;
- edgeItem.set_edge_type(edgeType);
- edgeItem.set_edge_name(edgeName);
- edgeItem.set_version(0);
- edgeItem.set_schema(req.get_schema());
- edgeSchemas[edgeName] = std::move(edgeItem);
- return Status::OK();
-}
-
-StatusOr<meta::cpp2::Schema> MetaCache::getEdge(const meta::cpp2::GetEdgeReq &req) {
- folly::RWSpinLock::ReadHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto edgeName = req.get_edge_name();
- auto &edgeSchemas = spaceIter->second.edgeSchemas_;
- auto findIter = edgeSchemas.find(edgeName);
- if (findIter == edgeSchemas.end()) {
- return Status::Error("Not found");
- }
- return findIter->second.get_schema();
-}
-
-StatusOr<std::vector<meta::cpp2::EdgeItem>>
-MetaCache::listEdges(const meta::cpp2::ListEdgesReq &req) {
- folly::RWSpinLock::ReadHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- std::vector<meta::cpp2::EdgeItem> edgeItems;
- for (const auto& item : spaceIter->second.edgeSchemas_) {
- edgeItems.emplace_back(item.second);
- }
- return edgeItems;
-}
-
-Status MetaCache::dropEdge(const meta::cpp2::DropEdgeReq& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifExists = req.get_if_exists();
- auto edgeName = req.get_edge_name();
- auto &edgeSchemas = spaceIter->second.edgeSchemas_;
- auto findIter = edgeSchemas.find(edgeName);
- if (ifExists && findIter == edgeSchemas.end()) {
- return Status::OK();
- }
-
- if (findIter == edgeSchemas.end()) {
- return Status::Error("Edge `%s' not existed", req.get_edge_name().c_str());
- }
-
- edgeSchemas.erase(findIter);
- return Status::OK();
-}
-
-Status MetaCache::AlterTag(const meta::cpp2::AlterTagReq &req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto tagName = req.get_tag_name();
- auto &tagSchemas = spaceIter->second.tagSchemas_;
- auto findIter = tagSchemas.find(tagName);
- if (findIter == tagSchemas.end()) {
- return Status::Error("Tag `%s' not existed", req.get_tag_name().c_str());
- }
-
- auto &schema = findIter->second.schema;
- auto items = req.get_tag_items();
- auto prop = req.get_schema_prop();
- auto status = alterColumnDefs(schema, items);
- if (!status.ok()) {
- return status;
- }
- return alterSchemaProp(schema, prop);
-}
-
-Status MetaCache::AlterEdge(const meta::cpp2::AlterEdgeReq &req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto edgeName = req.get_edge_name();
- auto &edgeSchemas = spaceIter->second.edgeSchemas_;
- auto findIter = edgeSchemas.find(edgeName);
- if (findIter == edgeSchemas.end()) {
- return Status::Error("Edge `%s' not existed", req.get_edge_name().c_str());
- }
-
- auto &schema = findIter->second.schema;
- auto items = req.get_edge_items();
- auto prop = req.get_schema_prop();
- auto status = alterColumnDefs(schema, items);
- if (!status.ok()) {
- return status;
- }
- return alterSchemaProp(schema, prop);
-}
-
-Status MetaCache::createTagIndex(const meta::cpp2::CreateTagIndexReq& req, IndexID &indexId) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifNotExists = req.get_if_not_exists();
- auto tagName = req.get_tag_name();
- auto indexName = req.get_index_name();
- auto &tagIndexes = spaceIter->second.tagIndexes_;
- auto findIndexIter = tagIndexes.find(indexName);
- if (ifNotExists && findIndexIter != tagIndexes.end()) {
- indexId = findIndexIter->second.get_index_id();
- return Status::OK();
- }
- if (findIndexIter != tagIndexes.end()) {
- LOG(INFO) << "\tIndex already exist";
- return Status::Error("Index already exist");
- }
-
- if (req.get_fields().empty()) {
- return Status::Error("column is empty");
- }
-
- auto &tagSchemas = spaceIter->second.tagSchemas_;
- auto findTagIter = tagSchemas.find(tagName);
- if (findTagIter == tagSchemas.end()) {
- return Status::Error("Tag Not found");
- }
- auto tagId = findTagIter->second.get_tag_id();
-
- indexId = ++id_;
- meta::cpp2::IndexItem indexItem;
- meta::cpp2::SchemaID schemaID;
- schemaID.set_tag_id(tagId);
- indexItem.set_schema_id(std::move(schemaID));
- indexItem.set_schema_name(tagName);
- indexItem.set_index_id(indexId);
- indexItem.set_index_name(indexName);
-
- std::vector<meta::cpp2::ColumnDef> columns;
- for (auto &field : req.get_fields()) {
- meta::cpp2::ColumnDef column;
- column.set_name(std::move(field));
- columns.emplace_back(std::move(column));
- }
- indexItem.set_fields(std::move(columns));
- tagIndexes[indexName] = std::move(indexItem);
- return Status::OK();
-}
-
-Status MetaCache::createEdgeIndex(const meta::cpp2::CreateEdgeIndexReq& req, IndexID &indexId) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- CHECK_SPACE_ID(req.get_space_id());
- auto ifNotExists = req.get_if_not_exists();
- auto edgeName = req.get_edge_name();
- auto indexName = req.get_index_name();
- auto &edgeIndexes = spaceIter->second.edgeIndexes_;
- auto findIndexIter = edgeIndexes.find(indexName);
- if (ifNotExists && findIndexIter != edgeIndexes.end()) {
- indexId = findIndexIter->second.get_index_id();
- return Status::OK();
- }
- if (findIndexIter != edgeIndexes.end()) {
- return Status::Error("Index already exist");
- }
-
- if (req.get_fields().empty()) {
- return Status::Error("column is empty");
- }
-
- auto &edgeSchemas = spaceIter->second.edgeSchemas_;
- auto findEdgeIter = edgeSchemas.find(edgeName);
- if (findEdgeIter == edgeSchemas.end()) {
- return Status::Error("Edge Not found");
- }
- auto edgeType = findEdgeIter->second.get_edge_type();
-
- indexId = ++id_;
- meta::cpp2::IndexItem indexItem;
- meta::cpp2::SchemaID schemaID;
- schemaID.set_edge_type(edgeType);
- indexItem.set_schema_id(std::move(schemaID));
- indexItem.set_schema_name(edgeName);
- indexItem.set_index_id(indexId);
- indexItem.set_index_name(indexName);
-
- std::vector<meta::cpp2::ColumnDef> columns;
- for (auto &field : req.get_fields()) {
- meta::cpp2::ColumnDef column;
- column.set_name(std::move(field));
- columns.emplace_back(std::move(column));
- }
- indexItem.set_fields(std::move(columns));
- edgeIndexes[indexName] = std::move(indexItem);
- return Status::OK();
-}
-
-Status MetaCache::dropTagIndex(const meta::cpp2::DropTagIndexReq&) {
- return Status::OK();
-}
-
-Status MetaCache::dropTagIndex(const meta::cpp2::DropEdgeIndexReq&) {
- return Status::OK();
-}
-
-Status MetaCache::regConfigs(const std::vector<meta::cpp2::ConfigItem>&) {
- return Status::OK();
-}
-
-Status MetaCache::setConfig(const meta::cpp2::ConfigItem&) {
- return Status::OK();
-}
-
-Status MetaCache::heartBeat(const meta::cpp2::HBReq& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto host = req.get_host();
- if (host.port == 0) {
- return Status::OK();
- }
- hostSet_.emplace(std::move(host));
- return Status::OK();
-}
-
-std::vector<meta::cpp2::HostItem> MetaCache::listHosts() {
- folly::RWSpinLock::WriteHolder holder(lock_);
- std::vector<meta::cpp2::HostItem> hosts;
- for (auto& spaceIdIt : spaceIndex_) {
- auto spaceName = spaceIdIt.first;
- for (auto &h : hostSet_) {
- meta::cpp2::HostItem host;
- host.set_hostAddr(h);
- host.set_status(meta::cpp2::HostStatus::ONLINE);
- std::unordered_map<std::string, std::vector<PartitionID>> leaderParts;
- std::vector<PartitionID> parts = {1};
- leaderParts.emplace(spaceName, parts);
- host.set_leader_parts(leaderParts);
- host.set_all_parts(std::move(leaderParts));
- }
- }
- return hosts;
-}
-
-std::unordered_map<PartitionID, std::vector<HostAddr>> MetaCache::getParts() {
- folly::RWSpinLock::WriteHolder holder(lock_);
- std::unordered_map<PartitionID, std::vector<HostAddr>> parts;
- parts[1] = {};
- for (auto &h : hostSet_) {
- parts[1].emplace_back(h);
- }
- return parts;
-}
-
-////////////////////////////////////////////// ACL related mock ////////////////////////////////////
-meta::cpp2::ExecResp MetaCache::createUser(const meta::cpp2::CreateUserReq& req) {
- meta::cpp2::ExecResp resp;
- folly::RWSpinLock::WriteHolder wh(userLock_);
- const auto user = users_.find(req.get_account());
- if (user != users_.end()) { // already exists
- resp.set_code(req.get_if_not_exists() ?
- meta::cpp2::ErrorCode::SUCCEEDED :
- meta::cpp2::ErrorCode::E_EXISTED);
- return resp;
- }
-
- auto result = users_.emplace(req.get_account(), UserInfo{req.get_encoded_pwd()});
- resp.set_code(result.second ?
- meta::cpp2::ErrorCode::SUCCEEDED :
- meta::cpp2::ErrorCode::E_UNKNOWN);
- return resp;
-}
-
-meta::cpp2::ExecResp MetaCache::dropUser(const meta::cpp2::DropUserReq& req) {
- meta::cpp2::ExecResp resp;
- folly::RWSpinLock::WriteHolder wh(userLock_);
- const auto user = users_.find(req.get_account());
- if (user == users_.end()) { // not exists
- resp.set_code(req.get_if_exists() ?
- meta::cpp2::ErrorCode::SUCCEEDED :
- meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
-
- auto result = users_.erase(req.get_account());
- resp.set_code(result == 1 ?
- meta::cpp2::ErrorCode::SUCCEEDED :
- meta::cpp2::ErrorCode::E_UNKNOWN);
- return resp;
-}
-
-meta::cpp2::ExecResp MetaCache::alterUser(const meta::cpp2::AlterUserReq& req) {
- meta::cpp2::ExecResp resp;
- folly::RWSpinLock::WriteHolder wh(userLock_);
- auto user = users_.find(req.get_account());
- if (user == users_.end()) { // not exists
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- user->second.password = req.get_encoded_pwd();
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- return resp;
-}
-
-meta::cpp2::ExecResp MetaCache::grantRole(const meta::cpp2::GrantRoleReq& req) {
- meta::cpp2::ExecResp resp;
- const auto &item = req.get_role_item();
- {
- folly::RWSpinLock::ReadHolder spaceRH(roleLock_);
- folly::RWSpinLock::ReadHolder userRH(userLock_);
- // find space
- auto space = roles_.find(item.get_space_id());
- if (space == roles_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- // find user
- auto user = users_.find(item.get_user_id());
- if (user == users_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- }
- folly::RWSpinLock::WriteHolder roleWH(roleLock_);
- // space
- auto space = roles_.find(item.get_space_id());
- // user
- auto user = space->second.find(item.get_user_id());
- if (user == space->second.end()) {
- space->second.emplace(item.get_user_id(),
- std::unordered_set<meta::cpp2::RoleType>{item.get_role_type()});
- } else {
- user->second.emplace(item.get_role_type());
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- return resp;
-}
-
-meta::cpp2::ExecResp MetaCache::revokeRole(const meta::cpp2::RevokeRoleReq& req) {
- meta::cpp2::ExecResp resp;
- const auto &item = req.get_role_item();
- folly::RWSpinLock::WriteHolder rolesWH(roleLock_);
- // find space
- auto space = roles_.find(item.get_space_id());
- if (space == roles_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- // find user
- auto user = space->second.find(item.get_user_id());
- if (user == space->second.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- // find role
- auto role = user->second.find(item.get_role_type());
- if (role == user->second.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- user->second.erase(item.get_role_type());
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- return resp;
-}
-
-meta::cpp2::ListUsersResp MetaCache::listUsers(const meta::cpp2::ListUsersReq&) {
- meta::cpp2::ListUsersResp resp;
- folly::RWSpinLock::ReadHolder rh(userLock_);
- std::unordered_map<std::string, std::string> users;
- for (const auto &user : users_) {
- users.emplace(user.first, user.second.password);
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_users(std::move(users));
- return resp;
-}
-
-meta::cpp2::ListRolesResp MetaCache::listRoles(const meta::cpp2::ListRolesReq& req) {
- meta::cpp2::ListRolesResp resp;
- folly::RWSpinLock::ReadHolder rh(roleLock_);
- std::vector<meta::cpp2::RoleItem> items;
- const auto space = roles_.find(req.get_space_id());
- if (space == roles_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- for (const auto &user : space->second) {
- for (const auto &role : user.second) {
- meta::cpp2::RoleItem item;
- item.set_space_id(space->first);
- item.set_user_id(user.first);
- item.set_role_type(role);
- items.emplace_back(std::move(item));
- }
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_roles(std::move(items));
- return resp;
-}
-
-meta::cpp2::ExecResp MetaCache::changePassword(const meta::cpp2::ChangePasswordReq& req) {
- meta::cpp2::ExecResp resp;
- folly::RWSpinLock::WriteHolder wh(userLock_);
- auto user = users_.find(req.get_account());
- if (user == users_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- if (user->second.password != req.get_old_encoded_pwd()) {
- resp.set_code(meta::cpp2::ErrorCode::E_INVALID_PASSWORD);
- }
- user->second.password = req.get_new_encoded_pwd();
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- return resp;
-}
-
-meta::cpp2::ListRolesResp MetaCache::getUserRoles(const meta::cpp2::GetUserRolesReq& req) {
- meta::cpp2::ListRolesResp resp;
- {
- folly::RWSpinLock::ReadHolder userRH(userLock_);
- // find user
- auto user = users_.find(req.get_account());
- if (user == users_.end()) {
- resp.set_code(meta::cpp2::ErrorCode::E_NOT_FOUND);
- return resp;
- }
- }
-
- folly::RWSpinLock::ReadHolder roleRH(roleLock_);
- std::vector<meta::cpp2::RoleItem> items;
- for (const auto& space : roles_) {
- const auto& user = space.second.find(req.get_account());
- if (user != space.second.end()) {
- for (const auto & role : user->second) {
- meta::cpp2::RoleItem item;
- item.set_space_id(space.first);
- item.set_user_id(user->first);
- item.set_role_type(role);
- items.emplace_back(std::move(item));
- }
- }
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_roles(std::move(items));
- return resp;
-}
-
-ErrorOr<meta::cpp2::ErrorCode, int64_t> MetaCache::balanceSubmit(std::vector<HostAddr> dels) {
- folly::RWSpinLock::ReadHolder rh(lock_);
- for (const auto &job : balanceJobs_) {
- if (job.second.status == meta::cpp2::TaskResult::IN_PROGRESS) {
- return meta::cpp2::ErrorCode::E_BALANCER_RUNNING;
- }
- }
- std::vector<BalanceTask> jobs;
- for (const auto &spaceInfo : spaces_) {
- for (PartitionID i = 1; i <= spaceInfo.second.get_properties().get_partition_num(); ++i) {
- for (const auto &host : hostSet_) { // Note mock partition in each host here
- if (std::find(dels.begin(), dels.end(), host) != dels.end()) {
- continue;
- }
- jobs.emplace_back(BalanceTask{
- // mock
- spaceInfo.first,
- i,
- host,
- host,
- meta::cpp2::TaskResult::IN_PROGRESS,
- });
- }
- }
- }
- auto jobId = incId();
- balanceTasks_.emplace(jobId, std::move(jobs));
- balanceJobs_.emplace(jobId, BalanceJob{
- meta::cpp2::TaskResult::IN_PROGRESS,
- });
- return jobId;
-}
-
-ErrorOr<meta::cpp2::ErrorCode, int64_t> MetaCache::balanceStop() {
- for (auto &job : balanceJobs_) {
- if (job.second.status == meta::cpp2::TaskResult::IN_PROGRESS) {
- job.second.status = meta::cpp2::TaskResult::FAILED;
- return job.first;
- }
- }
- return meta::cpp2::ErrorCode::E_NO_RUNNING_BALANCE_PLAN;
-}
-
-meta::cpp2::ErrorCode MetaCache::balanceLeaders() {
- return meta::cpp2::ErrorCode::SUCCEEDED;
-}
-
-ErrorOr<meta::cpp2::ErrorCode, std::vector<meta::cpp2::BalanceTask>>
-MetaCache::showBalance(int64_t id) {
- const auto job = balanceTasks_.find(id);
- if (job == balanceTasks_.end()) {
- return meta::cpp2::ErrorCode::E_NOT_FOUND;
- }
- std::vector<meta::cpp2::BalanceTask> result;
- result.reserve(job->second.size());
- for (const auto &task : job->second) {
- meta::cpp2::BalanceTask taskInfo;
- std::stringstream idStr;
- idStr << "[";
- idStr << id << ", ";
- idStr << task.space << ":" << task.part << ", ";
- idStr << task.from << "->" << task.to;
- idStr << "]";
- taskInfo.set_id(idStr.str());
- taskInfo.set_result(task.status);
- result.emplace_back(std::move(taskInfo));
- }
- return result;
-}
-
-ErrorOr<meta::cpp2::ErrorCode, meta::cpp2::AdminJobResult>
-MetaCache::runAdminJob(const meta::cpp2::AdminJobReq& req) {
- meta::cpp2::AdminJobResult result;
- switch (req.get_op()) {
- case meta::cpp2::AdminJobOp::ADD: {
- folly::RWSpinLock::WriteHolder wh(jobLock_);
- auto jobId = incId();
- jobs_.emplace(jobId, JobDesc{
- req.get_cmd(),
- req.get_paras(),
- meta::cpp2::JobStatus::QUEUE,
- 0,
- 0
- });
- std::vector<TaskDesc> descs;
- int32_t iTask = 0;
- for (const auto &host : hostSet_) {
- descs.reserve(hostSet_.size());
- descs.emplace_back(TaskDesc{
- ++iTask,
- host,
- meta::cpp2::JobStatus::QUEUE,
- 0,
- 0
- });
- }
- tasks_.emplace(jobId, std::move(descs));
- result.set_job_id(jobId);
- return result;
- }
- case meta::cpp2::AdminJobOp::RECOVER: {
- uint32_t jobNum = 0;
- folly::RWSpinLock::WriteHolder wh(jobLock_);
- for (auto &job : jobs_) {
- if (job.second.status_ == meta::cpp2::JobStatus::FAILED) {
- job.second.status_ = meta::cpp2::JobStatus::QUEUE;
- ++jobNum;
- }
- }
- result.set_recovered_job_num(jobNum);
- return result;
- }
- case meta::cpp2::AdminJobOp::SHOW: {
- folly::RWSpinLock::ReadHolder rh(jobLock_);
- auto ret = checkJobId(req);
- if (!ok(ret)) {
- return error(ret);
- }
- auto job = value(ret);
- result.set_job_id(job->first);
- std::vector<meta::cpp2::JobDesc> jobsDesc;
- meta::cpp2::JobDesc jobDesc;
- jobDesc.set_id(job->first);
- jobDesc.set_cmd(job->second.cmd_);
- jobDesc.set_status(job->second.status_);
- jobDesc.set_start_time(job->second.startTime_);
- jobDesc.set_stop_time(job->second.stopTime_);
- jobsDesc.emplace_back(std::move(jobDesc));
- result.set_job_desc(std::move(jobsDesc));
-
- // tasks
- const auto tasks = tasks_.find(job->first);
- if (tasks == tasks_.end()) {
- LOG(FATAL) << "Impossible not find tasks of job id " << job->first;
- }
- std::vector<meta::cpp2::TaskDesc> tasksDesc;
- for (const auto &task : tasks->second) {
- meta::cpp2::TaskDesc taskDesc;
- taskDesc.set_job_id(job->first);
- taskDesc.set_task_id(task.iTask_);
- taskDesc.set_host(task.dest_);
- taskDesc.set_status(task.status_);
- taskDesc.set_start_time(task.startTime_);
- taskDesc.set_stop_time(task.stopTime_);
- tasksDesc.emplace_back(std::move(taskDesc));
- }
- result.set_task_desc(std::move(tasksDesc));
- return result;
- }
- case meta::cpp2::AdminJobOp::SHOW_All: {
- std::vector<meta::cpp2::JobDesc> jobsDesc;
- folly::RWSpinLock::ReadHolder rh(jobLock_);
- for (const auto &job : jobs_) {
- meta::cpp2::JobDesc jobDesc;
- jobDesc.set_id(job.first);
- jobDesc.set_cmd(job.second.cmd_);
- jobDesc.set_status(job.second.status_);
- jobDesc.set_start_time(job.second.startTime_);
- jobDesc.set_stop_time(job.second.stopTime_);
- jobsDesc.emplace_back(std::move(jobDesc));
- }
- result.set_job_desc(std::move(jobsDesc));
- return result;
- }
- case meta::cpp2::AdminJobOp::STOP: {
- folly::RWSpinLock::WriteHolder wh(jobLock_);
- auto ret = checkJobId(req);
- if (!ok(ret)) {
- return error(ret);
- }
- auto job = value(ret);
- if (job->second.status_ != meta::cpp2::JobStatus::QUEUE &&
- job->second.status_ != meta::cpp2::JobStatus::RUNNING) {
- return meta::cpp2::ErrorCode::E_CONFLICT;
- }
- job->second.status_ = meta::cpp2::JobStatus::STOPPED;
- return result;
- }
- }
- return meta::cpp2::ErrorCode::E_INVALID_PARM;
-}
-
-Status MetaCache::alterColumnDefs(meta::cpp2::Schema &schema,
- const std::vector<meta::cpp2::AlterSchemaItem> &items) {
- std::vector<meta::cpp2::ColumnDef> columns = schema.columns;
- for (auto& item : items) {
- auto& cols = item.get_schema().get_columns();
- auto op = item.op;
- for (auto& col : cols) {
- switch (op) {
- case meta::cpp2::AlterSchemaOp::ADD:
- for (auto it = schema.columns.begin(); it != schema.columns.end(); ++it) {
- if (it->get_name() == col.get_name()) {
- return Status::Error("Column existing: `%s'", col.get_name().c_str());
- }
- }
- columns.emplace_back(col);
- break;
- case meta::cpp2::AlterSchemaOp::CHANGE: {
- bool isOk = false;
- for (auto it = columns.begin(); it != columns.end(); ++it) {
- auto colName = col.get_name();
- if (colName == it->get_name()) {
- // If this col is ttl_col, change not allowed
- if (schema.schema_prop.__isset.ttl_col &&
- (*schema.schema_prop.get_ttl_col() == colName)) {
- return Status::Error("Column: `%s' as ttl_col, change not allowed",
- colName.c_str());
- }
- *it = col;
- isOk = true;
- break;
- }
- }
- if (!isOk) {
- return Status::Error("Column not found: `%s'", col.get_name().c_str());
- }
- break;
- }
- case meta::cpp2::AlterSchemaOp::DROP: {
- bool isOk = false;
- for (auto it = columns.begin(); it != columns.end(); ++it) {
- auto colName = col.get_name();
- if (colName == it->get_name()) {
- if (schema.schema_prop.__isset.ttl_col &&
- (*schema.schema_prop.get_ttl_col() == colName)) {
- schema.schema_prop.set_ttl_duration(0);
- schema.schema_prop.set_ttl_col("");
- }
- columns.erase(it);
- isOk = true;
- break;
- }
- }
- if (!isOk) {
- return Status::Error("Column not found: `%s'", col.get_name().c_str());
- }
- break;
- }
- default:
- return Status::Error("Alter schema operator not supported");
- }
- }
- }
- schema.columns = std::move(columns);
- return Status::OK();
-}
-
-Status MetaCache::alterSchemaProp(meta::cpp2::Schema &schema,
- const meta::cpp2::SchemaProp &alterSchemaProp) {
- meta::cpp2::SchemaProp schemaProp = schema.get_schema_prop();
- if (alterSchemaProp.__isset.ttl_duration) {
- // Graph check <=0 to = 0
- schemaProp.set_ttl_duration(*alterSchemaProp.get_ttl_duration());
- }
- if (alterSchemaProp.__isset.ttl_col) {
- auto ttlCol = *alterSchemaProp.get_ttl_col();
- // Disable ttl, ttl_col is empty, ttl_duration is 0
- if (ttlCol.empty()) {
- schemaProp.set_ttl_duration(0);
- schemaProp.set_ttl_col(ttlCol);
- return Status::OK();
- }
-
- auto existed = false;
- for (auto& col : schema.columns) {
- if (col.get_name() == ttlCol) {
- // Only integer and timestamp columns can be used as ttl_col
- if (col.type.type != meta::cpp2::PropertyType::INT32 &&
- col.type.type != meta::cpp2::PropertyType::INT64 &&
- col.type.type != meta::cpp2::PropertyType::TIMESTAMP) {
- return Status::Error("TTL column type illegal");
- }
- existed = true;
- schemaProp.set_ttl_col(ttlCol);
- break;
- }
- }
-
- if (!existed) {
- return Status::Error("TTL column not found: `%s'", ttlCol.c_str());
- }
- }
-
- // Disable implicit TTL mode
- if ((schemaProp.get_ttl_duration() && (*schemaProp.get_ttl_duration() != 0)) &&
- (!schemaProp.get_ttl_col() || (schemaProp.get_ttl_col() &&
- schemaProp.get_ttl_col()->empty()))) {
- return Status::Error("Implicit ttl_col not support");
- }
-
- schema.set_schema_prop(std::move(schemaProp));
- return Status::OK();
-}
-
-Status MetaCache::createSnapshot() {
- folly::RWSpinLock::WriteHolder holder(lock_);
- if (cache_.empty()) {
- return Status::OK();
- }
- meta::cpp2::Snapshot snapshot;
- char ch[60];
- std::time_t t = std::time(nullptr);
- std::strftime(ch, sizeof(ch), "%Y_%m_%d_%H_%M_%S", localtime(&t));
- auto snapshotName = folly::stringPrintf("SNAPSHOT_%s", ch);
- snapshot.set_name(snapshotName);
- snapshot.set_status(meta::cpp2::SnapshotStatus::VALID);
- DCHECK(!hostSet_.empty());
- snapshot.set_hosts(network::NetworkUtils::toHostsStr(
- std::vector<HostAddr>(hostSet_.begin(), hostSet_.end())));
- snapshots_[snapshotName] = std::move(snapshot);
- return Status::OK();
-}
-
-Status MetaCache::dropSnapshot(const meta::cpp2::DropSnapshotReq& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto name = req.get_name();
- auto find = snapshots_.find(name);
- if (find == snapshots_.end()) {
- return Status::Error("`%s' is nonexistent", name.c_str());
- }
- snapshots_.erase(find);
- return Status::OK();
-}
-
-StatusOr<std::vector<meta::cpp2::Snapshot>> MetaCache::listSnapshots() {
- folly::RWSpinLock::ReadHolder holder(lock_);
- std::vector<meta::cpp2::Snapshot> snapshots;
- for (auto& snapshot : snapshots_) {
- snapshots.emplace_back(snapshot.second);
- }
- return snapshots;
-}
-
-} // namespace graph
-} // namespace nebula
diff --git a/src/mock/MetaCache.h b/src/mock/MetaCache.h
deleted file mode 100644
index b99c121f802cbd4f72e53e11f5a56f1ca88eeb3b..0000000000000000000000000000000000000000
--- a/src/mock/MetaCache.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#ifndef EXECUTOR_METACACHE_H_
-#define EXECUTOR_METACACHE_H_
-
-#include "common/base/Base.h"
-#include "common/base/StatusOr.h"
-#include "common/base/ErrorOr.h"
-#include "common/interface/gen-cpp2/meta_types.h"
-
-namespace nebula {
-namespace graph {
-
-class MetaCache final {
-public:
- static MetaCache& instance() {
- static MetaCache instance;
- return instance;
- }
-
- Status createSpace(const meta::cpp2::CreateSpaceReq &req, GraphSpaceID &spaceId);
-
- StatusOr<meta::cpp2::SpaceItem> getSpace(const meta::cpp2::GetSpaceReq &req);
-
- StatusOr<std::vector<meta::cpp2::IdName>> listSpaces();
-
- Status dropSpace(const meta::cpp2::DropSpaceReq &req);
-
- Status createTag(const meta::cpp2::CreateTagReq &req, TagID &tagId);
-
- StatusOr<meta::cpp2::Schema> getTag(const meta::cpp2::GetTagReq &req);
-
- StatusOr<std::vector<meta::cpp2::TagItem>> listTags(const meta::cpp2::ListTagsReq &req);
-
- Status createEdge(const meta::cpp2::CreateEdgeReq &req, EdgeType &edgeType);
-
- StatusOr<meta::cpp2::Schema> getEdge(const meta::cpp2::GetEdgeReq &req);
-
- StatusOr<std::vector<meta::cpp2::EdgeItem>> listEdges(const meta::cpp2::ListEdgesReq &req);
-
- Status dropTag(const meta::cpp2::DropTagReq &req);
-
- Status dropEdge(const meta::cpp2::DropEdgeReq &req);
-
- Status AlterTag(const meta::cpp2::AlterTagReq &req);
-
- Status AlterEdge(const meta::cpp2::AlterEdgeReq &req);
-
- Status createTagIndex(const meta::cpp2::CreateTagIndexReq &req, IndexID &indexId);
-
- Status createEdgeIndex(const meta::cpp2::CreateEdgeIndexReq &req, IndexID &indexId);
-
- Status dropTagIndex(const meta::cpp2::DropTagIndexReq &req);
-
- Status dropTagIndex(const meta::cpp2::DropEdgeIndexReq &req);
-
- Status regConfigs(const std::vector<meta::cpp2::ConfigItem> &items);
-
- Status setConfig(const meta::cpp2::ConfigItem &req);
-
- Status heartBeat(const meta::cpp2::HBReq &req);
-
- std::vector<meta::cpp2::HostItem> listHosts();
-
- std::unordered_map<PartitionID, std::vector<HostAddr>> getParts();
-
-////////////////////////////////////////////// ACL related mock ////////////////////////////////////
- meta::cpp2::ExecResp createUser(const meta::cpp2::CreateUserReq& req);
-
- meta::cpp2::ExecResp dropUser(const meta::cpp2::DropUserReq& req);
-
- meta::cpp2::ExecResp alterUser(const meta::cpp2::AlterUserReq& req);
-
- meta::cpp2::ExecResp grantRole(const meta::cpp2::GrantRoleReq& req);
-
- meta::cpp2::ExecResp revokeRole(const meta::cpp2::RevokeRoleReq& req);
-
- meta::cpp2::ListUsersResp listUsers(const meta::cpp2::ListUsersReq& req);
-
- meta::cpp2::ListRolesResp listRoles(const meta::cpp2::ListRolesReq& req);
-
- meta::cpp2::ExecResp changePassword(const meta::cpp2::ChangePasswordReq& req);
-
- meta::cpp2::ListRolesResp getUserRoles(const meta::cpp2::GetUserRolesReq& req);
-
- ErrorOr<meta::cpp2::ErrorCode, int64_t> balanceSubmit(std::vector<HostAddr> dels);
- ErrorOr<meta::cpp2::ErrorCode, int64_t> balanceStop();
- meta::cpp2::ErrorCode balanceLeaders();
- ErrorOr<meta::cpp2::ErrorCode, std::vector<meta::cpp2::BalanceTask>>
- showBalance(int64_t id);
-
- ErrorOr<meta::cpp2::ErrorCode, meta::cpp2::AdminJobResult>
- runAdminJob(const meta::cpp2::AdminJobReq& req);
-
- Status createSnapshot();
-
- Status dropSnapshot(const meta::cpp2::DropSnapshotReq& req);
-
- StatusOr<std::vector<meta::cpp2::Snapshot>> listSnapshots();
-
-private:
- MetaCache() = default;
-
- int64_t incId() {
- return ++id_;
- }
-
- Status alterColumnDefs(meta::cpp2::Schema &schema,
- const std::vector<meta::cpp2::AlterSchemaItem> &items);
-
- Status alterSchemaProp(meta::cpp2::Schema &schema,
- const meta::cpp2::SchemaProp &alterSchemaProp);
-
-
-private:
- enum class EntryType : int8_t {
- SPACE = 0x01,
- TAG = 0x02,
- EDGE = 0x03,
- INDEX = 0x04,
- CONFIG = 0x05,
- };
-
- template<class T>
- std::enable_if_t<std::is_integral<T>::value, meta::cpp2::ID>
- to(T id, EntryType type) {
- meta::cpp2::ID thriftID;
- switch (type) {
- case EntryType::SPACE:
- thriftID.set_space_id(static_cast<GraphSpaceID>(id));
- break;
- case EntryType::TAG:
- thriftID.set_tag_id(static_cast<TagID>(id));
- break;
- case EntryType::EDGE:
- thriftID.set_edge_type(static_cast<EdgeType>(id));
- break;
- case EntryType::CONFIG:
- break;
- case EntryType::INDEX:
- thriftID.set_index_id(static_cast<IndexID>(id));
- break;
- }
- return thriftID;
- }
-
-private:
- using HostMap = std::unordered_map<std::pair<GraphSpaceID, PartitionID>, HostAddr>;
- using TagSchemas = std::unordered_map<std::string, meta::cpp2::TagItem>;
- using EdgeSchemas = std::unordered_map<std::string, meta::cpp2::EdgeItem>;
- using Indexes = std::unordered_map<std::string, meta::cpp2::IndexItem>;
-
- struct SpaceInfoCache {
- TagSchemas tagSchemas_;
- EdgeSchemas edgeSchemas_;
- Indexes tagIndexes_;
- Indexes edgeIndexes_;
- };
-
- std::unordered_set<HostAddr> hostSet_;
- std::unordered_map<std::string, GraphSpaceID> spaceIndex_;
- std::unordered_map<GraphSpaceID, SpaceInfoCache> cache_;
- std::unordered_map<GraphSpaceID, meta::cpp2::SpaceItem> spaces_;
- int64_t id_{0};
- std::unordered_map<std::string, meta::cpp2::Snapshot> snapshots_;
- mutable folly::RWSpinLock lock_;
-
-///////////////////////////////////////////// ACL cache ////////////////////////////////////////////
- struct UserInfo {
- std::string password;
- // revserved
- };
-
- // username -> UserInfo
- std::unordered_map<std::string, UserInfo> users_;
- mutable folly::RWSpinLock userLock_;
- // authority
- using UserRoles =
- std::unordered_map<std::string/*user*/, std::unordered_set<meta::cpp2::RoleType>>;
- std::unordered_map<GraphSpaceID, UserRoles> roles_;
- mutable folly::RWSpinLock roleLock_;
-
-////////////////////////////////////////////// Balance /////////////////////////////////////////////
- struct BalanceTask {
- GraphSpaceID space;
- PartitionID part;
- HostAddr from;
- HostAddr to;
- meta::cpp2::TaskResult status;
- };
- struct BalanceJob {
- meta::cpp2::TaskResult status;
- };
- std::unordered_map<int64_t, std::vector<BalanceTask>> balanceTasks_;
- std::unordered_map<int64_t, BalanceJob> balanceJobs_;
-
-////////////////////////////////////////////// Job /////////////////////////////////////////////////
- struct JobDesc {
- meta::cpp2::AdminCmd cmd_; // compact, flush ...
- std::vector<std::string> paras_;
- meta::cpp2::JobStatus status_;
- int64_t startTime_;
- int64_t stopTime_;
- };
- struct TaskDesc {
- int32_t iTask_;
- nebula::HostAddr dest_;
- meta::cpp2::JobStatus status_;
- int64_t startTime_;
- int64_t stopTime_;
- };
-
- ErrorOr<meta::cpp2::ErrorCode, std::unordered_map<int64_t, JobDesc>::iterator>
- checkJobId(const meta::cpp2::AdminJobReq& req) {
- const auto ¶ms = req.get_paras();
- if (params.empty()) {
- return meta::cpp2::ErrorCode::E_INVALID_PARM;
- }
- int64_t jobId;
- try {
- jobId = folly::to<int64_t>(params.front());
- } catch (std::exception &e) {
- LOG(ERROR) << e.what();
- return meta::cpp2::ErrorCode::E_INVALID_PARM;
- }
- const auto job = jobs_.find(jobId);
- if (job == jobs_.end()) {
- return meta::cpp2::ErrorCode::E_INVALID_PARM;
- }
- return job;
- }
-
-
- mutable folly::RWSpinLock jobLock_;
- // jobId => jobs
- std::unordered_map<int64_t, JobDesc> jobs_;
- // jobId => tasks
- std::unordered_map<int64_t, std::vector<TaskDesc>> tasks_;
-};
-
-} // namespace graph
-} // namespace nebula
-#endif // EXECUTOR_METACACHE_H_
diff --git a/src/mock/MockMetaServiceHandler.cpp b/src/mock/MockMetaServiceHandler.cpp
deleted file mode 100644
index 74d4b4e055c891d9724559f4596a96ba6fb9b345..0000000000000000000000000000000000000000
--- a/src/mock/MockMetaServiceHandler.cpp
+++ /dev/null
@@ -1,654 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "mock/MockMetaServiceHandler.h"
-
-#include "common/time/WallClock.h"
-#include "mock/MetaCache.h"
-
-namespace nebula {
-namespace graph {
-
-#define RETURN_SUCCESSED() \
- folly::Promise<meta::cpp2::ExecResp> promise; \
- auto future = promise.getFuture(); \
- meta::cpp2::ExecResp resp; \
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED); \
- promise.setValue(std::move(resp)); \
- return future;
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createSpace(const meta::cpp2::CreateSpaceReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- GraphSpaceID spaceId;
- auto status = MetaCache::instance().createSpace(req, spaceId);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- meta::cpp2::ID id;
- id.set_space_id(spaceId);
- resp.set_id(id);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropSpace(const meta::cpp2::DropSpaceReq &req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().dropSpace(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListSpacesResp>
-MockMetaServiceHandler::future_listSpaces(const meta::cpp2::ListSpacesReq&) {
- folly::Promise<meta::cpp2::ListSpacesResp> promise;
- auto future = promise.getFuture();
- auto status = MetaCache::instance().listSpaces();
- meta::cpp2::ListSpacesResp resp;
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_spaces(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::AdminJobResp>
-MockMetaServiceHandler::future_runAdminJob(const meta::cpp2::AdminJobReq& req) {
- meta::cpp2::AdminJobResp resp;
- auto result = MetaCache::instance().runAdminJob(req);
- if (!ok(result)) {
- resp.set_code(result.left());
- return resp;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_result(std::move(result).right());
- return resp;
-}
-
-folly::Future<meta::cpp2::GetSpaceResp>
-MockMetaServiceHandler::future_getSpace(const meta::cpp2::GetSpaceReq& req) {
- folly::Promise<meta::cpp2::GetSpaceResp> promise;
- auto future = promise.getFuture();
- auto status = MetaCache::instance().getSpace(req);
- meta::cpp2::GetSpaceResp resp;
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- auto spaceInfo = std::move(status).value();
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_item(std::move(spaceInfo));
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListHostsResp>
-MockMetaServiceHandler::future_listHosts(const meta::cpp2::ListHostsReq&) {
- folly::Promise<meta::cpp2::ListHostsResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListHostsResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_hosts(MetaCache::instance().listHosts());
- promise.setValue(resp);
- return future;
-}
-
-folly::Future<meta::cpp2::ListPartsResp>
-MockMetaServiceHandler::future_listParts(const meta::cpp2::ListPartsReq&) {
- folly::Promise<meta::cpp2::ListPartsResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListPartsResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::GetPartsAllocResp>
-MockMetaServiceHandler::future_getPartsAlloc(const meta::cpp2::GetPartsAllocReq&) {
- folly::Promise<meta::cpp2::GetPartsAllocResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetPartsAllocResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_parts(MetaCache::instance().getParts());
- promise.setValue(resp);
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_multiPut(const meta::cpp2::MultiPutReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::GetResp>
-MockMetaServiceHandler::future_get(const meta::cpp2::GetReq&) {
- folly::Promise<meta::cpp2::GetResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::MultiGetResp>
-MockMetaServiceHandler::future_multiGet(const meta::cpp2::MultiGetReq&) {
- folly::Promise<meta::cpp2::MultiGetResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::MultiGetResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ScanResp>
-MockMetaServiceHandler::future_scan(const meta::cpp2::ScanReq&) {
- folly::Promise<meta::cpp2::ScanResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ScanResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_remove(const meta::cpp2::RemoveReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_removeRange(const meta::cpp2::RemoveRangeReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createTag(const meta::cpp2::CreateTagReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- TagID tagId = 0;
- auto status = MetaCache::instance().createTag(req, tagId);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- meta::cpp2::ID id;
- id.set_tag_id(tagId);
- resp.set_id(std::move(id));
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_alterTag(const meta::cpp2::AlterTagReq &req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().AlterTag(req);
- if (!status.ok()) {
- LOG(ERROR) << status;
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropTag(const meta::cpp2::DropTagReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().dropTag(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::GetTagResp>
-MockMetaServiceHandler::future_getTag(const meta::cpp2::GetTagReq& req) {
- folly::Promise<meta::cpp2::GetTagResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetTagResp resp;
- auto status = MetaCache::instance().getTag(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_schema(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListTagsResp>
-MockMetaServiceHandler::future_listTags(const meta::cpp2::ListTagsReq& req) {
- folly::Promise<meta::cpp2::ListTagsResp> promise;
- auto future = promise.getFuture();
- auto status = MetaCache::instance().listTags(req);
- meta::cpp2::ListTagsResp resp;
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
-
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_tags(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createEdge(const meta::cpp2::CreateEdgeReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- EdgeType edgeType;
- auto status = MetaCache::instance().createEdge(req, edgeType);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- meta::cpp2::ID id;
- id.set_edge_type(edgeType);
- resp.set_id(std::move(id));
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_alterEdge(const meta::cpp2::AlterEdgeReq &req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().AlterEdge(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropEdge(const meta::cpp2::DropEdgeReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().dropEdge(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::GetEdgeResp>
-MockMetaServiceHandler::future_getEdge(const meta::cpp2::GetEdgeReq& req) {
- folly::Promise<meta::cpp2::GetEdgeResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetEdgeResp resp;
- auto status = MetaCache::instance().getEdge(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_schema(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListEdgesResp>
-MockMetaServiceHandler::future_listEdges(const meta::cpp2::ListEdgesReq& req) {
- folly::Promise<meta::cpp2::ListEdgesResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListEdgesResp resp;
- auto status = MetaCache::instance().listEdges(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
-
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_edges(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createTagIndex(const meta::cpp2::CreateTagIndexReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- IndexID indexId = 0;
- auto status = MetaCache::instance().createTagIndex(req, indexId);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- meta::cpp2::ID id;
- id.set_index_id(indexId);
- resp.set_id(std::move(id));
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropTagIndex(const meta::cpp2::DropTagIndexReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::GetTagIndexResp>
-MockMetaServiceHandler::future_getTagIndex(const meta::cpp2::GetTagIndexReq&) {
- folly::Promise<meta::cpp2::GetTagIndexResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetTagIndexResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListTagIndexesResp>
-MockMetaServiceHandler::future_listTagIndexes(const meta::cpp2::ListTagIndexesReq&) {
- folly::Promise<meta::cpp2::ListTagIndexesResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListTagIndexesResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_rebuildTagIndex(const meta::cpp2::RebuildIndexReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ListIndexStatusResp>
-MockMetaServiceHandler::future_listTagIndexStatus(const meta::cpp2::ListIndexStatusReq&) {
- folly::Promise<meta::cpp2::ListIndexStatusResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListIndexStatusResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createEdgeIndex(const meta::cpp2::CreateEdgeIndexReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropEdgeIndex(const meta::cpp2::DropEdgeIndexReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::GetEdgeIndexResp>
-MockMetaServiceHandler::future_getEdgeIndex(const meta::cpp2::GetEdgeIndexReq&) {
- folly::Promise<meta::cpp2::GetEdgeIndexResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetEdgeIndexResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListEdgeIndexesResp>
-MockMetaServiceHandler::future_listEdgeIndexes(const meta::cpp2::ListEdgeIndexesReq&) {
- folly::Promise<meta::cpp2::ListEdgeIndexesResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListEdgeIndexesResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_rebuildEdgeIndex(const meta::cpp2::RebuildIndexReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ListIndexStatusResp>
-MockMetaServiceHandler::future_listEdgeIndexStatus(const meta::cpp2::ListIndexStatusReq&) {
- folly::Promise<meta::cpp2::ListIndexStatusResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListIndexStatusResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::HBResp>
-MockMetaServiceHandler::future_heartBeat(const meta::cpp2::HBReq& req) {
- folly::Promise<meta::cpp2::HBResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::HBResp resp;
- auto status = MetaCache::instance().heartBeat(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
-
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_cluster_id(clusterId_);
- resp.set_last_update_time_in_ms(time::WallClock::fastNowInMilliSec());
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createUser(const meta::cpp2::CreateUserReq& req) {
- return MetaCache::instance().createUser(req);
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropUser(const meta::cpp2::DropUserReq& req) {
- return MetaCache::instance().dropUser(req);
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_alterUser(const meta::cpp2::AlterUserReq& req) {
- return MetaCache::instance().alterUser(req);
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_grantRole(const meta::cpp2::GrantRoleReq& req) {
- return MetaCache::instance().grantRole(req);
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_revokeRole(const meta::cpp2::RevokeRoleReq& req) {
- return MetaCache::instance().revokeRole(req);
-}
-
-folly::Future<meta::cpp2::ListUsersResp>
-MockMetaServiceHandler::future_listUsers(const meta::cpp2::ListUsersReq& req) {
- return MetaCache::instance().listUsers(req);
-}
-
-folly::Future<meta::cpp2::ListRolesResp>
-MockMetaServiceHandler::future_listRoles(const meta::cpp2::ListRolesReq& req) {
- return MetaCache::instance().listRoles(req);
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_changePassword(const meta::cpp2::ChangePasswordReq& req) {
- return MetaCache::instance().changePassword(req);
-}
-
-folly::Future<meta::cpp2::ListRolesResp>
-MockMetaServiceHandler::future_getUserRoles(const meta::cpp2::GetUserRolesReq& req) {
- return MetaCache::instance().getUserRoles(req);
-}
-
-folly::Future<meta::cpp2::BalanceResp>
-MockMetaServiceHandler::future_balance(const meta::cpp2::BalanceReq& req) {
- meta::cpp2::BalanceResp resp;
- if (req.__isset.id) {
- // show
- auto result = MetaCache::instance().showBalance(*req.get_id());
- if (ok(result)) {
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_tasks(std::move(result).right());
- } else {
- resp.set_code(result.left());
- }
- } else if (req.__isset.stop) {
- // stop
- auto result = MetaCache::instance().balanceStop();
- if (ok(result)) {
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_id(result.right());
- } else {
- resp.set_code(result.left());
- }
- } else {
- ErrorOr<meta::cpp2::ErrorCode, int64_t> result;
- // submit
- if (req.__isset.host_del) {
- result = MetaCache::instance().balanceSubmit(*req.get_host_del());
- } else {
- result = MetaCache::instance().balanceSubmit({});
- }
- if (ok(result)) {
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_id(result.right());
- } else {
- resp.set_code(result.left());
- }
- }
- return resp;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_leaderBalance(const meta::cpp2::LeaderBalanceReq&) {
- meta::cpp2::ExecResp resp;
- auto result = MetaCache::instance().balanceLeaders();
- resp.set_code(result);
- return resp;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_regConfig(const meta::cpp2::RegConfigReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::GetConfigResp>
-MockMetaServiceHandler::future_getConfig(const meta::cpp2::GetConfigReq&) {
- folly::Promise<meta::cpp2::GetConfigResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::GetConfigResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_setConfig(const meta::cpp2::SetConfigReq&) {
- RETURN_SUCCESSED();
-}
-
-folly::Future<meta::cpp2::ListConfigsResp>
-MockMetaServiceHandler::future_listConfigs(const meta::cpp2::ListConfigsReq&) {
- folly::Promise<meta::cpp2::ListConfigsResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListConfigsResp resp;
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_createSnapshot(const meta::cpp2::CreateSnapshotReq&) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().createSnapshot();
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ExecResp>
-MockMetaServiceHandler::future_dropSnapshot(const meta::cpp2::DropSnapshotReq& req) {
- folly::Promise<meta::cpp2::ExecResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ExecResp resp;
- auto status = MetaCache::instance().dropSnapshot(req);
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- promise.setValue(std::move(resp));
- return future;
-}
-
-folly::Future<meta::cpp2::ListSnapshotsResp>
-MockMetaServiceHandler::future_listSnapshots(const meta::cpp2::ListSnapshotsReq&) {
- folly::Promise<meta::cpp2::ListSnapshotsResp> promise;
- auto future = promise.getFuture();
- meta::cpp2::ListSnapshotsResp resp;
- auto status = MetaCache::instance().listSnapshots();
- if (!status.ok()) {
- resp.set_code(meta::cpp2::ErrorCode::E_UNKNOWN);
- promise.setValue(std::move(resp));
- return future;
- }
- resp.set_code(meta::cpp2::ErrorCode::SUCCEEDED);
- resp.set_snapshots(std::move(status).value());
- promise.setValue(std::move(resp));
- return future;
-}
-} // namespace graph
-} // namespace nebula
diff --git a/src/mock/StorageCache.cpp b/src/mock/StorageCache.cpp
deleted file mode 100644
index a1228d14a9d2e4922590ff82f9889596c1e2146c..0000000000000000000000000000000000000000
--- a/src/mock/StorageCache.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "mock/StorageCache.h"
-
-DECLARE_int32(heartbeat_interval_secs);
-
-namespace nebula {
-namespace graph {
-
-StorageCache::StorageCache(uint16_t metaPort) {
- FLAGS_heartbeat_interval_secs = 1;
- auto threadPool = std::make_shared<folly::IOThreadPoolExecutor>(1);
- auto hostStatus = network::NetworkUtils::resolveHost("127.0.0.1", metaPort);
- meta::MetaClientOptions options;
- options.serviceName_ = "StorageCache";
- metaClient_ = std::make_unique<meta::MetaClient>(threadPool,
- std::move(hostStatus).value(), options);
- metaClient_->waitForMetadReady();
- mgr_ = std::make_unique<meta::ServerBasedSchemaManager>();
- mgr_->init(metaClient_.get());
-}
-
-Status StorageCache::addVertices(const storage::cpp2::AddVerticesRequest& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto spaceId = req.get_space_id();
- auto spaceFind = cache_.find(spaceId);
- SpaceDataInfo *spaceDataInfo = nullptr;
- if (spaceFind != cache_.end()) {
- spaceDataInfo = &spaceFind->second;
- } else {
- cache_[spaceId] = SpaceDataInfo();
- spaceDataInfo = &cache_[spaceId];
- }
-
- std::unordered_map<TagID, std::vector<std::string>> propNames;
- for (auto &prop : req.get_prop_names()) {
- propNames[prop.first] = prop.second;
- }
-
- auto &parts = req.get_parts();
- for (auto &part : parts) {
- for (auto &vertex : part.second) {
- auto vId = vertex.get_id();
- auto findV = spaceDataInfo->vertices.find(vId.getStr());
- std::unordered_map<TagID,
- std::unordered_map<std::string, Value>> *vertexInfo = nullptr;
- if (findV != spaceDataInfo->vertices.end()) {
- vertexInfo = &findV->second;
- } else {
- spaceDataInfo->vertices[vId.getStr()] = {};
- vertexInfo = &spaceDataInfo->vertices[vId.getStr()];
- }
-
- for (auto &tag : vertex.get_tags()) {
- auto tagId = tag.get_tag_id();
- auto propValues = tag.get_props();
- if (propValues.size() != propNames[tagId].size()) {
- return Status::Error("Wrong size");
- }
- auto ret = getTagWholeValue(spaceId, tagId, propValues, propNames[tagId]);
- if (!ret.ok()) {
- LOG(ERROR) << ret.status();
- return ret.status();
- }
- (*vertexInfo)[tagId] = std::move(ret).value();
- }
- }
- }
- return Status::OK();
-}
-
-Status StorageCache::addEdges(const storage::cpp2::AddEdgesRequest& req) {
- folly::RWSpinLock::WriteHolder holder(lock_);
- auto spaceId = req.get_space_id();
- auto spaceFind = cache_.find(spaceId);
- SpaceDataInfo *spaceDataInfo = nullptr;
- if (spaceFind != cache_.end()) {
- spaceDataInfo = &spaceFind->second;
- } else {
- cache_[spaceId] = SpaceDataInfo();
- spaceDataInfo = &cache_[spaceId];
- }
-
- std::vector<std::string> propNames = req.get_prop_names();
- auto &parts = req.get_parts();
- for (auto &part : parts) {
- for (auto &edge : part.second) {
- storage::cpp2::EdgeKey edgeKey;
- edgeKey.set_src(edge.key.get_src());
- auto edgeType = edge.key.get_edge_type();
- edgeKey.set_edge_type(edgeType);
- edgeKey.set_ranking(edge.key.get_ranking());
- edgeKey.set_dst(edge.key.get_dst());
- auto propValues = edge.get_props();
- if (propValues.size() != propNames.size()) {
- LOG(ERROR) << "Wrong size, propValues.size : " << propValues.size()
- << ", propNames.size : " << propNames.size();
- return Status::Error("Wrong size");
- }
- auto ret = getEdgeWholeValue(spaceId, edgeType, propValues, propNames);
- if (!ret.ok()) {
- LOG(ERROR) << ret.status();
- return ret.status();
- }
- spaceDataInfo->edges[edgeKey] = std::move(ret).value();
- }
- }
- return Status::OK();
-}
-
-StatusOr<std::unordered_map<std::string, Value>>
-StorageCache::getTagWholeValue(const GraphSpaceID spaceId,
- const TagID tagId,
- const std::vector<Value>& props,
- const std::vector<std::string> &names) {
- if (props.size() != names.size()) {
- return Status::Error("Wrong size between props and names");
- }
- auto schema = mgr_->getTagSchema(spaceId, tagId);
- if (schema == nullptr) {
- return Status::Error("TagId `%d' not exist", tagId);
- }
- return getPropertyInfo(schema, props, names);
-}
-
-StatusOr<std::unordered_map<std::string, Value>>
-StorageCache::getEdgeWholeValue(const GraphSpaceID spaceId,
- const EdgeType edgeType,
- const std::vector<Value>& props,
- const std::vector<std::string> &names) {
- if (props.size() != names.size()) {
- return Status::Error("Wrong size between props and names");
- }
- auto schema = mgr_->getEdgeSchema(spaceId, std::abs(edgeType));
- if (schema == nullptr) {
- return Status::Error("EdgeType `%d' not exist", edgeType);
- }
- return getPropertyInfo(schema, props, names);
-}
-
-StatusOr<std::unordered_map<std::string, Value>>
-StorageCache::getPropertyInfo(std::shared_ptr<const meta::NebulaSchemaProvider> schema,
- const std::vector<Value>& props,
- const std::vector<std::string> &names) {
- auto number = schema->getNumFields();
- if (number == 0 && props.size() == 0) {
- return {};
- }
- if (number == 0 && props.size() != 0) {
- return Status::Error("Wrong value about empty schema");
- }
-
- std::bitset<32> indexBitSet;
- std::unordered_map<std::string, Value> propertyInfo;
- auto index = 0u;
- for (auto &item : names) {
- auto filed = schema->field(item);
- if (filed != nullptr) {
- indexBitSet.set(index);
- if (!filed->nullable() && props[index].isNull()) {
- return Status::Error("Wrong null type `%s'", item.c_str());
- }
- propertyInfo.emplace(item, props[index]);
- } else {
- return Status::Error("Wrong prop name `%s'", item.c_str());
- }
- index++;
- }
-
- if (schema->getNumFields() != indexBitSet.count()) {
- for (auto i = 0u; i < schema->getNumFields(); i++) {
- if (indexBitSet[i] != 1) {
- auto field = schema->field(i);
- if (field != nullptr && !field->hasDefault()) {
- return Status::Error("Prop name `%s' without default value",
- field->name());
- }
- VLOG(1) << "Add default value, filed name: " << field->name();
- propertyInfo.emplace(field->name(), field->defaultValue());
- }
- }
- }
-
- return propertyInfo;
-}
-} // namespace graph
-} // namespace nebula
diff --git a/src/mock/StorageCache.h b/src/mock/StorageCache.h
deleted file mode 100644
index 57d8ceeafb980e32323f7707ac2fd1a04873327c..0000000000000000000000000000000000000000
--- a/src/mock/StorageCache.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#ifndef EXECUTOR_STORAGECACHE_H_
-#define EXECUTOR_STORAGECACHE_H_
-
-#include "common/base/Base.h"
-#include "common/base/StatusOr.h"
-#include "common/interface/gen-cpp2/storage_types.h"
-#include "common/clients/meta/MetaClient.h"
-#include "common/meta/ServerBasedSchemaManager.h"
-
-namespace nebula {
-namespace graph {
-
-struct EdgeHasher {
- std::size_t operator()(const storage::cpp2::EdgeKey& k) const {
- std::size_t hash_val = 0;
- hash_val ^= ((std::hash<Value>()(k.get_src())) << 1);
- hash_val ^= ((std::hash<int32_t>()(k.get_edge_type())) << 1);
- hash_val ^= ((std::hash<int64_t>()(k.get_ranking())) << 1);
- hash_val ^= ((std::hash<Value>()(k.get_dst())) << 1);
- return hash_val;
- }
-};
-
-using VerticesInfo = std::unordered_map<VertexID,
- std::unordered_map<TagID, std::unordered_map<std::string, Value>>>;
-using EdgesInfo = std::unordered_map<storage::cpp2::EdgeKey,
- std::unordered_map<std::string, Value>, EdgeHasher>;
-
-class StorageCache final {
-public:
- explicit StorageCache(uint16_t metaPort);
-
- ~StorageCache() = default;
-
- Status addVertices(const storage::cpp2::AddVerticesRequest& req);
-
- Status addEdges(const storage::cpp2::AddEdgesRequest& req);
-
-private:
- StatusOr<std::unordered_map<std::string, Value>>
- getTagWholeValue(const GraphSpaceID spaceId,
- const TagID tagId,
- const std::vector<Value>& props,
- const std::vector<std::string> &names);
-
- StatusOr<std::unordered_map<std::string, Value>>
- getEdgeWholeValue(const GraphSpaceID spaceId,
- const EdgeType edgeType,
- const std::vector<Value>& props,
- const std::vector<std::string> &names);
-
- StatusOr<std::unordered_map<std::string, Value>>
- getPropertyInfo(std::shared_ptr<const meta::NebulaSchemaProvider> schema,
- const std::vector<Value>& props,
- const std::vector<std::string> &names);
-
-private:
- struct SpaceDataInfo {
- SpaceDataInfo() = default;
- ~SpaceDataInfo() = default;
- VerticesInfo vertices;
- EdgesInfo edges;
- };
-
- std::unordered_map<GraphSpaceID, SpaceDataInfo> cache_;
- mutable folly::RWSpinLock lock_;
- std::unique_ptr<meta::MetaClient> metaClient_;
- std::unique_ptr<meta::ServerBasedSchemaManager> mgr_;
-};
-
-} // namespace graph
-} // namespace nebula
-#endif // EXECUTOR_STORAGECACHE_H_
diff --git a/src/mock/test/AdminJobTest.cpp b/src/mock/test/AdminJobTest.cpp
deleted file mode 100644
index e9cb5308cf97017759cb882d8b8c23502972380f..0000000000000000000000000000000000000000
--- a/src/mock/test/AdminJobTest.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "common/base/Status.h"
-#include "common/network/NetworkUtils.h"
-#include "common/interface/gen-cpp2/common_types.h"
-#include "mock/test/TestEnv.h"
-#include "mock/test/TestBase.h"
-#include <gtest/gtest.h>
-
-DECLARE_int32(heartbeat_interval_secs);
-
-namespace nebula {
-namespace graph {
-
-class AdminJobTest : public TestBase {
-public:
- void SetUp() override {
- TestBase::SetUp();
- client_ = gEnv->getGraphClient();
- ASSERT_NE(nullptr, client_);
- };
-
- void TearDown() override {
- TestBase::TearDown();
- client_.reset();
- };
-
-protected:
- std::unique_ptr<GraphClient> client_;
-};
-
-TEST_F(AdminJobTest, Error) {
- {
- // submit without space
- cpp2::ExecutionResponse resp;
- std::string query = "SUBMIT JOB COMPACT";
- client_->execute(query, resp);
- // TODO(shylock) semantic error?
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::E_SEMANTIC_ERROR);
- }
- {
- // show one not exists
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW JOB 233";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::E_EXECUTION_ERROR);
- }
- {
- // stop one not exists
- cpp2::ExecutionResponse resp;
- std::string query = "STOP JOB 233";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::E_EXECUTION_ERROR);
- }
-}
-
-TEST_F(AdminJobTest, Base) {
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE space_for_default(partition_num=9, replica_factor=1);";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
- }
- sleep(FLAGS_heartbeat_interval_secs + 1);
- {
- cpp2::ExecutionResponse resp;
- std::string query = "USE space_for_default;";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
- }
- {
- // submit
- cpp2::ExecutionResponse resp;
- std::string query = "SUBMIT JOB COMPACT";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- DataSet expected({"New Job Id"});
- expected.emplace_back(Row({
- 2
- }));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- {
- // submit
- cpp2::ExecutionResponse resp;
- std::string query = "SUBMIT JOB FLUSH";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- DataSet expected({"New Job Id"});
- expected.emplace_back(Row({
- 3
- }));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- {
- // show all
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW JOBS";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- nebula::DataSet expected({"Job Id", "Command", "Status", "Start Time", "Stop Time"});
- expected.emplace_back(Row({
- 2, "COMPACT", "QUEUE", 0, 0,
- }));
- expected.emplace_back(Row({
- 3, "FLUSH", "QUEUE", 0, 0
- }));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- // TODO current not support should move it into show
- /*
- {
- // show one
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW JOB 2";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- nebula::DataSet expected(
- {"Job Id(TaskId)", "Command(Dest)", "Status", "Start Time", "Stop Time"});
- expected.emplace_back(Row({2, "COMPACT", "QUEUE", 0, 0}));
- expected.emplace_back(Row({1, "127.0.0.1", "QUEUE", 0, 0}));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- {
- // stop one
- cpp2::ExecutionResponse resp;
- std::string query = "STOP JOB 2";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- nebula::DataSet expected({"Result"});
- expected.emplace_back(Row({"Job stopped"}));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- {
- // show all
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW JOBS";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- nebula::DataSet expected({"Job Id", "Command", "Status", "Start Time", "Stop Time"});
- expected.emplace_back(Row({
- 2, "COMPACT", "STOPPED", 0, 0,
- }));
- expected.emplace_back(Row({
- 3, "FLUSH", "QUEUE", 0, 0
- }));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- {
- // recover
- cpp2::ExecutionResponse resp;
- std::string query = "RECOVER JOB";
- client_->execute(query, resp);
- ASSERT_ERROR_CODE(resp, cpp2::ErrorCode::SUCCEEDED);
-
- nebula::DataSet expected({"Recovered job num"});
- expected.emplace_back(Row({
- 0
- }));
- ASSERT_TRUE(verifyDataSetWithoutOrder(resp, expected));
- }
- */
-}
-
-} // namespace graph
-} // namespace nebula
diff --git a/src/mock/test/CMakeLists.txt b/src/mock/test/CMakeLists.txt
deleted file mode 100644
index 8171efc8683a930973b60007d76bd982b3f86a7e..0000000000000000000000000000000000000000
--- a/src/mock/test/CMakeLists.txt
+++ /dev/null
@@ -1,150 +0,0 @@
-# Copyright (c) 2020 vesoft inc. All rights reserved.
-#
-# This source code is licensed under Apache 2.0 License,
-# attached with Common Clause Condition 1.0, found in the LICENSES directory.
-#
-
-set(GRAPH_TEST_LIB
- $<TARGET_OBJECTS:mock_obj>
- $<TARGET_OBJECTS:util_obj>
- $<TARGET_OBJECTS:service_obj>
- $<TARGET_OBJECTS:session_obj>
- $<TARGET_OBJECTS:query_engine_obj>
- $<TARGET_OBJECTS:graph_flags_obj>
- $<TARGET_OBJECTS:parser_obj>
- $<TARGET_OBJECTS:validator_obj>
- $<TARGET_OBJECTS:expr_visitor_obj>
- $<TARGET_OBJECTS:planner_obj>
- $<TARGET_OBJECTS:executor_obj>
- $<TARGET_OBJECTS:scheduler_obj>
- $<TARGET_OBJECTS:idgenerator_obj>
- $<TARGET_OBJECTS:context_obj>
- $<TARGET_OBJECTS:graph_auth_obj>
- $<TARGET_OBJECTS:optimizer_obj>
- $<TARGET_OBJECTS:common_time_function_obj>
- $<TARGET_OBJECTS:common_expression_obj>
- $<TARGET_OBJECTS:common_http_client_obj>
- $<TARGET_OBJECTS:common_network_obj>
- $<TARGET_OBJECTS:common_process_obj>
- $<TARGET_OBJECTS:common_graph_client_obj>
- $<TARGET_OBJECTS:common_storage_client_base_obj>
- $<TARGET_OBJECTS:common_graph_storage_client_obj>
- $<TARGET_OBJECTS:common_meta_client_obj>
- $<TARGET_OBJECTS:common_stats_obj>
- $<TARGET_OBJECTS:common_meta_thrift_obj>
- $<TARGET_OBJECTS:common_graph_thrift_obj>
- $<TARGET_OBJECTS:common_common_thrift_obj>
- $<TARGET_OBJECTS:common_storage_thrift_obj>
- $<TARGET_OBJECTS:common_thrift_obj>
- $<TARGET_OBJECTS:common_meta_obj>
- $<TARGET_OBJECTS:common_thread_obj>
- $<TARGET_OBJECTS:common_time_obj>
- $<TARGET_OBJECTS:common_fs_obj>
- $<TARGET_OBJECTS:common_base_obj>
- $<TARGET_OBJECTS:common_concurrent_obj>
- $<TARGET_OBJECTS:common_datatypes_obj>
- $<TARGET_OBJECTS:common_conf_obj>
- $<TARGET_OBJECTS:common_file_based_cluster_id_man_obj>
- $<TARGET_OBJECTS:common_charset_obj>
- $<TARGET_OBJECTS:common_function_manager_obj>
- $<TARGET_OBJECTS:common_http_client_obj>
- $<TARGET_OBJECTS:common_encryption_obj>
- $<TARGET_OBJECTS:common_agg_function_obj>
- $<TARGET_OBJECTS:common_time_utils_obj>
-)
-
-nebula_add_test(
- NAME
- mock_server_test
- SOURCES
- TestMock.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- ${THRIFT_LIBRARIES}
- gtest
- gtest_main
- proxygenhttpserver
- proxygenlib
- wangle
-)
-
-nebula_add_test(
- NAME
- schema_test
- SOURCES
- SchemaTest.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- ${THRIFT_LIBRARIES}
- proxygenhttpserver
- proxygenlib
- wangle
- gtest
- gtest_main
-)
-
-nebula_add_test(
- NAME
- acl_test
- SOURCES
- ACLTest.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- ${THRIFT_LIBRARIES}
- gtest
- gtest_main
- proxygenhttpserver
- proxygenlib
- wangle
-)
-
-nebula_add_test(
- NAME
- balance_test
- SOURCES
- BalanceTest.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- proxygenhttpserver
- proxygenlib
- ${THRIFT_LIBRARIES}
- wangle
- gtest
- gtest_main
-)
-
-nebula_add_test(
- NAME
- admin_job_test
- SOURCES
- AdminJobTest.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- proxygenhttpserver
- proxygenlib
- ${THRIFT_LIBRARIES}
- wangle
- gtest
- gtest_main
-)
-
-nebula_add_test(
- NAME
- snapshot_test
- SOURCES
- SnapshotTest.cpp
- OBJECTS
- ${GRAPH_TEST_LIB}
- LIBRARIES
- ${THRIFT_LIBRARIES}
- proxygenhttpserver
- proxygenlib
- wangle
- gtest
- gtest_main
-)
diff --git a/src/mock/test/SchemaTest.cpp b/src/mock/test/SchemaTest.cpp
deleted file mode 100644
index 3d26963378029273200d6ab6646e35872e982da2..0000000000000000000000000000000000000000
--- a/src/mock/test/SchemaTest.cpp
+++ /dev/null
@@ -1,474 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "common/base/Status.h"
-#include "common/network/NetworkUtils.h"
-#include "common/interface/gen-cpp2/common_types.h"
-#include "mock/test/TestEnv.h"
-#include "mock/test/TestBase.h"
-#include <gtest/gtest.h>
-
-DECLARE_int32(heartbeat_interval_secs);
-
-namespace nebula {
-namespace graph {
-class SchemaTest : public TestBase {
-public:
- void SetUp() override {
- TestBase::SetUp();
- };
-
- void TearDown() override {
- TestBase::TearDown();
- };
-
- static void SetUpTestCase() {
- client_ = gEnv->getGraphClient();
- ASSERT_NE(nullptr, client_);
- }
-
- static void TearDownTestCase() {
- client_.reset();
- }
-
-protected:
- static std::unique_ptr<GraphClient> client_;
-};
-
-std::unique_ptr<GraphClient> SchemaTest::client_{nullptr};
-
-TEST_F(SchemaTest, TestSpace) {
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE space_for_default(partition_num=9, replica_factor=1);";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE space_set_vid_type(partition_num=9, "
- "replica_factor=1, vid_type=FIXED_STRING(20));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DESC SPACE space_for_default;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"ID", "Name", "Partition Number", "Replica Factor",
- "Charset", "Collate", "Vid Type"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {1, "space_for_default", 9,
- 1, "utf8", "utf8_bin", "FIXED_STRING(8)"};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE space_2("
- "partition_num=9, replica_factor=1, vid_type=FIXED_STRING(20));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW SPACES;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {"space_2"},
- {"space_for_default"},
- {"space_set_vid_type"}
- };
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Show Create space
- std::string createSpaceStr;
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW CREATE SPACE space_2";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- createSpaceStr = "CREATE SPACE `space_2` ("
- "partition_num = 9, "
- "replica_factor = 1, "
- "charset = utf8, "
- "collate = utf8_bin, "
- "vid_type = FIXED_STRING(20))";
- std::vector<std::string> colNames = {"Space", "Create Space"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {"space_2", createSpaceStr};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Drop space
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DROP SPACE space_2";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW SPACES;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {{"space_for_default"}, {"space_set_vid_type"}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // use show create space result
- {
- cpp2::ExecutionResponse resp;
- auto code = client_->execute(createSpaceStr, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
-
- std::string query = "SHOW SPACES;";
- code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {"space_2"},
- {"space_for_default"},
- {"space_set_vid_type"}
- };
- ASSERT_TRUE(verifyValues(resp, values));
- }
-}
-
-TEST_F(SchemaTest, TestTag) {
- sleep(FLAGS_heartbeat_interval_secs + 1);
- {
- cpp2::ExecutionResponse resp;
- std::string query = "USE space_for_default";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE TAG student(name STRING NOT NULL, "
- "age INT8 DEFAULT 18, grade FIXED_STRING(10), start INT64 DEFAULT 2020)"
- " ttl_duration = 3600, ttl_col = \"start\";";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DESC TAG student;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- ASSERT_TRUE(resp.__isset.data);
- std::vector<std::string> colNames = {"Field", "Type", "Null", "Default"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {"name", "string", "NO", Value::kEmpty},
- {"age", "int8", "YES", 18},
- {"grade", "fixed_string(10)", "YES", Value::kEmpty},
- {"start", "int64", "YES", 2020}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE TAG person(name STRING DEFAULT \"\", amount FLOAT);";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW TAGS;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {{"person"}, {"student"}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Show Create tag
- std::string createTagStr;
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW CREATE TAG student";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- createTagStr = "CREATE TAG `student` (\n"
- " `name` string NOT NULL,\n"
- " `age` int8 NULL DEFAULT 18,\n"
- " `grade` fixed_string(10) NULL,\n"
- " `start` int64 NULL DEFAULT 2020\n"
- ") ttl_duration = 3600, ttl_col = \"start\"";
- std::vector<std::string> colNames = {"Tag", "Create Tag"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {"student", createTagStr};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DROP TAG student;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW TAGS;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {"person"};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Check the show create tag result is ok
- {
- cpp2::ExecutionResponse resp;
- auto code = client_->execute(createTagStr, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
-
- std::string query = "SHOW TAGS;";
- code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {{"person"}, {"student"}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE A; USE A; "
- "CREATE TAG tag1(name STRING, age INT8, grade FIXED_STRING(10));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
-}
-
-TEST_F(SchemaTest, TestEdge) {
- {
- cpp2::ExecutionResponse resp;
- std::string query = "USE space_for_default; "
- "CREATE EDGE schoolmate(start int NOT NULL, end int);";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DESC EDGE schoolmate;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- ASSERT_TRUE(resp.__isset.data);
- std::vector<std::string> colNames = {"Field", "Type", "Null", "Default"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {"start", "int64", "NO", Value::kEmpty},
- {"end", "int64", "YES", Value::kEmpty}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE EDGE like(name STRING NOT NULL DEFAULT \"\", amount FLOAT);";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW EDGES;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {{"like"}, {"schoolmate"}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Show Create edge
- std::string createEdgeStr;
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW CREATE EDGE like";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- createEdgeStr = "CREATE EDGE `like` (\n"
- " `name` string NOT NULL DEFAULT \"\",\n"
- " `amount` float NULL\n"
- ") ttl_duration = 0, ttl_col = \"\"";
- std::vector<std::string> colNames = {"Edge", "Create Edge"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {"like", createEdgeStr};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DROP EDGE like;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "SHOW EDGES;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<Value> values = {"schoolmate"};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- // Check the show create edge result is ok
- {
- cpp2::ExecutionResponse resp;
- auto code = client_->execute(createEdgeStr, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
-
- std::string query = "SHOW EDGES;";
- code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- std::vector<std::string> colNames = {"Name"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {{"like"}, {"schoolmate"}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE SPACE B; USE B; "
- "CREATE EDGE edge1(name STRING, age INT8, grade FIXED_STRING(10));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
-}
-
-TEST_F(SchemaTest, TestAlterTag) {
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE TAG alterTag(col1 STRING, col2 INT8, "
- "col3 DOUBLE, col4 FIXED_STRING(10));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "ALTER TAG alterTag "
- "ADD (col5 TIMESTAMP, col6 DATE NOT NULL), "
- "CHANGE (col2 INT8 DEFAULT 10), "
- "DROP (col4)";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DESC TAG alterTag;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- ASSERT_TRUE(resp.__isset.data);
- std::vector<std::string> colNames = {"Field", "Type", "Null", "Default"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {Value("col1"), Value("string"), Value("YES"), Value()},
- {Value("col2"), Value("int8"), Value("YES"), Value(10)},
- {Value("col3"), Value("double"), Value("YES"), Value()},
- {Value("col5"), Value("timestamp"), Value("YES"), Value()},
- {Value("col6"), Value("date"), Value("NO"), Value()}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
-}
-
-TEST_F(SchemaTest, TestAlterEdge) {
- {
- cpp2::ExecutionResponse resp;
- std::string query = "CREATE EDGE alterEdge(col1 STRING, col2 INT8, "
- "col3 DOUBLE, col4 FIXED_STRING(10));";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "ALTER EDGE alterEdge "
- "ADD (col5 TIMESTAMP, col6 DATE NOT NULL), "
- "CHANGE (col2 INT8 DEFAULT 10), "
- "DROP (col4)";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "DESC EDGE alterEdge;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- ASSERT_TRUE(resp.__isset.data);
- std::vector<std::string> colNames = {"Field", "Type", "Null", "Default"};
- ASSERT_TRUE(verifyColNames(resp, colNames));
- std::vector<std::vector<Value>> values = {
- {Value("col1"), Value("string"), Value("YES"), Value()},
- {Value("col2"), Value("int8"), Value("YES"), Value(10)},
- {Value("col3"), Value("double"), Value("YES"), Value()},
- {Value("col5"), Value("timestamp"), Value("YES"), Value()},
- {Value("col6"), Value("date"), Value("NO"), Value()}};
- ASSERT_TRUE(verifyValues(resp, values));
- }
-}
-
-TEST_F(SchemaTest, TestInsert) {
- sleep(FLAGS_heartbeat_interval_secs + 1);
- {
- cpp2::ExecutionResponse resp;
- std::string query = "USE space_for_default;";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "USE space_for_default; INSERT VERTEX student(name, age, grade) "
- "VALUES \"Tom\":(\"Tom\", 18, \"three\");";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT VERTEX student(name, age, grade) "
- "VALUES \"Lily\":(\"Lily\", 18, \"three\");";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT VERTEX student(name, age, grade) "
- "VALUES \"Tom\":(\"Tom\", 18, \"three\");"
- "INSERT VERTEX student(name, age, grade) "
- "VALUES \"Tom\":(\"Tom\", 18, \"three\");";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT VERTEX student(name, age, grade) "
- "VALUES 100:(\"100\", 17, \"three\");";
- auto code = client_->execute(query, resp);
- ASSERT_NE(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT EDGE schoolmate(start, end) "
- "VALUES \"Tom\"->\"Lily\":(2009, 2011)";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT EDGE schoolmate(start, end) "
- "VALUES \"Tom\"->\"Lily\":(2009, 2011)";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
- {
- cpp2::ExecutionResponse resp;
- std::string query = "INSERT EDGE schoolmate(start, end) "
- "VALUES \"Tom\"->\"Lily\":(2009, 2011);"
- "INSERT EDGE schoolmate(start, end) "
- "VALUES \"Tom\"->\"Lily\":(2009, 2011)";
- auto code = client_->execute(query, resp);
- ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code);
- }
-}
-} // namespace graph
-} // namespace nebula
diff --git a/src/mock/test/TestMock.cpp b/src/mock/test/TestMock.cpp
deleted file mode 100644
index 93f8de033b41c3544e818dece7f0c72ca4e7fe7b..0000000000000000000000000000000000000000
--- a/src/mock/test/TestMock.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Copyright (c) 2020 vesoft inc. All rights reserved.
- *
- * This source code is licensed under Apache 2.0 License,
- * attached with Common Clause Condition 1.0, found in the LICENSES directory.
- */
-
-#include "common/base/Status.h"
-#include "common/network/NetworkUtils.h"
-#include "common/interface/gen-cpp2/common_types.h"
-#include "mock/test/TestEnv.h"
-#include "mock/test/TestBase.h"
-#include "context/QueryExpressionContext.h"
-#include <gtest/gtest.h>
-
-DECLARE_int32(heartbeat_interval_secs);
-
-namespace nebula {
-namespace graph {
-class MockServerTest : public TestBase {
-public:
- void SetUp() override {
- TestBase::SetUp();
- };
-
- void TearDown() override {
- TestBase::TearDown();
- };
-};
-
-TEST_F(MockServerTest, TestMeta) {
- GraphSpaceID spaceId1 = 0;
- GraphSpaceID spaceId2 = 0;
- auto metaClient = gEnv->getMetaClient();
- // Test space
- {
- // Create space
- std::string spaceName1 = "TEST_SPACE1";
- meta::cpp2::SpaceDesc spaceDesc1;
- spaceDesc1.set_space_name(spaceName1);
- spaceDesc1.set_partition_num(10);
- spaceDesc1.set_replica_factor(1);
- bool ifNotExists = true;
- auto status = metaClient->createSpace(spaceDesc1, ifNotExists).get();
- spaceId1 = status.value();
-
- std::string spaceName2 = "TEST_SPACE2";
- meta::cpp2::SpaceDesc spaceDesc2;
- spaceDesc2.set_space_name(spaceName2);
- spaceDesc2.set_partition_num(100);
- spaceDesc2.set_replica_factor(3);
- status = metaClient->createSpace(spaceDesc2, ifNotExists).get();
- spaceId2 = status.value();
-
- // Get space
- auto getStatus = metaClient->getSpace(spaceName1).get();
- ASSERT_TRUE(getStatus.ok());
- ASSERT_EQ(spaceId1, getStatus.value().get_space_id());
- ASSERT_EQ(10, getStatus.value().get_properties().get_partition_num());
- ASSERT_EQ(1, getStatus.value().get_properties().get_replica_factor());
- ASSERT_EQ(8, *getStatus.value().get_properties().get_vid_type().get_type_length());
-
- getStatus = metaClient->getSpace(spaceName2).get();
- ASSERT_TRUE(getStatus.ok());
- ASSERT_EQ(spaceId2, getStatus.value().get_space_id());
- ASSERT_EQ(100, getStatus.value().get_properties().get_partition_num());
- ASSERT_EQ(3, getStatus.value().get_properties().get_replica_factor());
- ASSERT_EQ(8, *getStatus.value().get_properties().get_vid_type().get_type_length());
-
- // List spaces
- auto listStatus = metaClient->listSpaces().get();
- ASSERT_TRUE(listStatus.ok());
- auto spaces = listStatus.value();
- ASSERT_EQ(2, spaces.size());
-
- std::vector<meta::SpaceIdName> expected;
- expected.emplace_back(spaceId2, spaceName2);
- expected.emplace_back(spaceId1, spaceName1);
- ASSERT_EQ(expected, spaces);
- }
- QueryExpressionContext ctx;
- // Test tag
- {
- // Create tag
- for (auto i = 0u; i < 10; i++) {
- meta::cpp2::Schema tagSchema;
- meta::cpp2::ColumnDef col;
- col.set_name(folly::stringPrintf("col_%d", i));
- col.type.set_type(meta::cpp2::PropertyType::STRING);
- ConstantExpression defaultValue("NULL");
- col.set_default_value(defaultValue.encode());
- std::vector<meta::cpp2::ColumnDef> cols;
- cols.emplace_back(col);
- tagSchema.set_columns(std::move(cols));
- auto status = metaClient->createTagSchema(spaceId1,
- folly::stringPrintf("tag_%d", i), tagSchema, false).get();
- ASSERT_TRUE(status.ok());
- }
-
- // Get tag
- for (auto i = 0u; i < 10; i++) {
- auto status = metaClient->getTagSchema(spaceId1,
- folly::stringPrintf("tag_%d", i)).get();
- ASSERT_TRUE(status.ok());
- auto schema = status.value();
- ASSERT_EQ(1, schema.get_columns().size());
- ASSERT_EQ(folly::stringPrintf("col_%d", i), schema.get_columns()[0].get_name());
- ASSERT_EQ(meta::cpp2::PropertyType::STRING,
- schema.get_columns()[0].get_type().get_type());
- ASSERT_EQ("NULL", Expression::decode(
- *schema.get_columns()[0].get_default_value())->eval(ctx(nullptr)).getStr());
- }
-
- // List tags
- auto listStatus = metaClient->listTagSchemas(spaceId1).get();
- ASSERT_TRUE(listStatus.ok());
- ASSERT_EQ(10, listStatus.value().size());
-
- // Drop tag
- for (auto i = 5u; i < 10; i++) {
- auto status = metaClient->dropTagSchema(spaceId1,
- folly::stringPrintf("tag_%d", i), true).get();
- ASSERT_TRUE(status.ok());
- }
-
- // List tags
- listStatus = metaClient->listTagSchemas(spaceId1).get();
- ASSERT_TRUE(listStatus.ok());
- ASSERT_EQ(5, listStatus.value().size());
- }
-
- // Test edge
- {
- // Create edge
- for (auto i = 0u; i < 10; i++) {
- meta::cpp2::Schema edgeSchema;
- meta::cpp2::ColumnDef col;
- col.set_name(folly::stringPrintf("col_%d", i));
- col.type.set_type(meta::cpp2::PropertyType::STRING);
- ConstantExpression defaultValue("NULL");
- col.set_default_value(defaultValue.encode());
- std::vector<meta::cpp2::ColumnDef> cols;
- cols.emplace_back(col);
- edgeSchema.set_columns(std::move(cols));
- auto status = metaClient->createEdgeSchema(spaceId1,
- folly::stringPrintf("edge_%d", i), edgeSchema, false).get();
- ASSERT_TRUE(status.ok());
- }
-
- // Get edge
- for (auto i = 0u; i < 10; i++) {
- auto status = metaClient->getEdgeSchema(spaceId1,
- folly::stringPrintf("edge_%d", i)).get();
- ASSERT_TRUE(status.ok());
- auto schema = status.value();
- ASSERT_EQ(1, schema.get_columns().size());
- ASSERT_EQ(folly::stringPrintf("col_%d", i), schema.get_columns()[0].get_name());
- ASSERT_EQ(meta::cpp2::PropertyType::STRING,
- schema.get_columns()[0].get_type().get_type());
- ASSERT_EQ("NULL", Expression::decode(
- *schema.get_columns()[0].get_default_value())->eval(ctx(nullptr)).getStr());
- }
-
- // List edges
- auto listStatus = metaClient->listEdgeSchemas(spaceId1).get();
- ASSERT_TRUE(listStatus.ok());
- ASSERT_EQ(10, listStatus.value().size());
-
- // Drop edge
- for (auto i = 5u; i < 10; i++) {
- auto status = metaClient->dropEdgeSchema(spaceId1,
- folly::stringPrintf("edge_%d", i), true).get();
- ASSERT_TRUE(status.ok());
- }
-
- // List edges
- listStatus = metaClient->listEdgeSchemas(spaceId1).get();
- ASSERT_TRUE(listStatus.ok());
- ASSERT_EQ(5, listStatus.value().size());
- }
- sleep(FLAGS_heartbeat_interval_secs + 1);
-}
-
-TEST_F(MockServerTest, DISABLED_TestStorage) {
- auto storageClient = gEnv->getStorageClient();
- GraphSpaceID space = 1;
- std::vector<Value> props;
- props.emplace_back("hello");
- storage::cpp2::NewTag tag;
- tag.set_tag_id(3);
- tag.set_props(std::move(props));
- std::vector<storage::cpp2::NewTag> tags;
- tags.emplace_back(tag);
-
- storage::cpp2::NewVertex vertex;
- vertex.set_id("2020");
- vertex.set_tags(std::move(tags));
- std::vector<storage::cpp2::NewVertex> vertices;
- vertices.emplace_back(std::move(vertex));
-
- std::unordered_map<TagID, std::vector<std::string>> propNames;
- propNames[3] = {"col"};
- auto resp = storageClient->addVertices(space, vertices, propNames, false).get();
- ASSERT_TRUE(resp.succeeded());
-}
-
-} // namespace graph
-} // namespace nebula
diff --git a/tests/mutate/test_insert_2.py b/tests/mutate/test_insert_2.py
index b1ecdd6a4356d8be2ab9399d3281820aae896dad..287fafea9b00c9c17eead2dd26f61a0e36dfffad 100644
--- a/tests/mutate/test_insert_2.py
+++ b/tests/mutate/test_insert_2.py
@@ -32,10 +32,12 @@ class TestInsert2(NebulaTestSuite):
def test_insert_out_of_range_id_size(self):
resp = self.execute('INSERT VERTEX student(name, age) VALUES "12345678901":("Tom", "2")')
self.check_resp_failed(resp)
+ self.check_error_msg(resp, 'Storage Error: Invalid vid.')
def test_insert_not_null_prop(self):
resp = self.execute('INSERT VERTEX student(name, age) VALUES "Tom":(NULL, 12)')
self.check_resp_failed(resp)
+ self.check_error_msg(resp, "Storage Error: The not null field cannot be null.")
def test_insert_with_fix_string(self):
# succeeded