From eb12e31923ff485c02a97113556b85592b97c9c5 Mon Sep 17 00:00:00 2001 From: jimingquan Date: Fri, 17 Jun 2022 11:28:37 +0800 Subject: [PATCH 1/2] check god role exist when meta init --- src/daemons/MetaDaemon.cpp | 2 +- src/daemons/StandAloneDaemon.cpp | 2 +- src/meta/RootUserMan.h | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/daemons/MetaDaemon.cpp b/src/daemons/MetaDaemon.cpp index 5664bf2fac9..3ab77c273f8 100644 --- a/src/daemons/MetaDaemon.cpp +++ b/src/daemons/MetaDaemon.cpp @@ -176,7 +176,7 @@ int main(int argc, char* argv[]) { } if (nebula::value(ret) == localhost) { LOG(INFO) << "Check and init root user"; - if (!nebula::meta::RootUserMan::isUserExists(gKVStore.get())) { + if (!nebula::meta::RootUserMan::isGodExists(gKVStore.get())) { if (!nebula::meta::RootUserMan::initRootUser(gKVStore.get())) { LOG(ERROR) << "Init root user failed"; return EXIT_FAILURE; diff --git a/src/daemons/StandAloneDaemon.cpp b/src/daemons/StandAloneDaemon.cpp index 4b17749856b..fdf38fe49ee 100644 --- a/src/daemons/StandAloneDaemon.cpp +++ b/src/daemons/StandAloneDaemon.cpp @@ -234,7 +234,7 @@ int main(int argc, char *argv[]) { } if (nebula::value(ret) == metaLocalhost) { LOG(INFO) << "Check and init root user"; - if (!nebula::meta::RootUserMan::isUserExists(gMetaKVStore.get())) { + if (!nebula::meta::RootUserMan::isGodExists(gMetaKVStore.get())) { if (!nebula::meta::RootUserMan::initRootUser(gMetaKVStore.get())) { LOG(ERROR) << "Init root user failed"; return; diff --git a/src/meta/RootUserMan.h b/src/meta/RootUserMan.h index fbc45b1fd16..c1b9d687d69 100644 --- a/src/meta/RootUserMan.h +++ b/src/meta/RootUserMan.h @@ -20,6 +20,27 @@ namespace meta { * */ class RootUserMan { public: + static bool isGodExists(kvstore::KVStore* kv) { + auto rolePrefix = MetaKeyUtils::roleSpacePrefix(kDefaultSpaceId); + std::unique_ptr iter; + auto code = kv->prefix(kDefaultSpaceId, kDefaultPartId, rolePrefix, &iter, false); + if (code != nebula::cpp2::ErrorCode::SUCCEEDED) { + LOG(INFO) << "Prefix God Role Failed"; + return false; + } + while (iter->valid()) { + auto val = iter->val(); + auto type = *reinterpret_cast(val.begin()); + if (type == meta::cpp2::RoleType::GOD) { + LOG(INFO) << "God user exists"; + return true; + } + iter->next(); + } + LOG(INFO) << "God user is not exists"; + return false; + } + static bool isUserExists(kvstore::KVStore* kv) { auto userKey = MetaKeyUtils::userKey("root"); std::string val; From a934347aff09f0c72de0c0c94e6a3c121a02cd75 Mon Sep 17 00:00:00 2001 From: jimingquan Date: Fri, 17 Jun 2022 14:31:31 +0800 Subject: [PATCH 2/2] return error if kv fail --- src/daemons/MetaDaemon.cpp | 15 ++++++++++----- src/daemons/StandAloneDaemon.cpp | 15 ++++++++++----- src/meta/RootUserMan.h | 5 ++--- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/daemons/MetaDaemon.cpp b/src/daemons/MetaDaemon.cpp index 3ab77c273f8..4c21c118a14 100644 --- a/src/daemons/MetaDaemon.cpp +++ b/src/daemons/MetaDaemon.cpp @@ -176,11 +176,16 @@ int main(int argc, char* argv[]) { } if (nebula::value(ret) == localhost) { LOG(INFO) << "Check and init root user"; - if (!nebula::meta::RootUserMan::isGodExists(gKVStore.get())) { - if (!nebula::meta::RootUserMan::initRootUser(gKVStore.get())) { - LOG(ERROR) << "Init root user failed"; - return EXIT_FAILURE; - } + auto checkRet = nebula::meta::RootUserMan::isGodExists(gKVStore.get()); + if (!nebula::ok(checkRet)) { + auto retCode = nebula::error(checkRet); + LOG(ERROR) << "Parser God Role error:" << apache::thrift::util::enumNameSafe(retCode); + return EXIT_FAILURE; + } + auto existGod = nebula::value(checkRet); + if (!existGod && !nebula::meta::RootUserMan::initRootUser(gKVStore.get())) { + LOG(ERROR) << "Init root user failed"; + return EXIT_FAILURE; } } } diff --git a/src/daemons/StandAloneDaemon.cpp b/src/daemons/StandAloneDaemon.cpp index fdf38fe49ee..5b519f726f5 100644 --- a/src/daemons/StandAloneDaemon.cpp +++ b/src/daemons/StandAloneDaemon.cpp @@ -234,11 +234,16 @@ int main(int argc, char *argv[]) { } if (nebula::value(ret) == metaLocalhost) { LOG(INFO) << "Check and init root user"; - if (!nebula::meta::RootUserMan::isGodExists(gMetaKVStore.get())) { - if (!nebula::meta::RootUserMan::initRootUser(gMetaKVStore.get())) { - LOG(ERROR) << "Init root user failed"; - return; - } + auto checkRet = nebula::meta::RootUserMan::isGodExists(gMetaKVStore.get()); + if (!nebula::ok(checkRet)) { + auto retCode = nebula::error(checkRet); + LOG(ERROR) << "Parser God Role error:" << apache::thrift::util::enumNameSafe(retCode); + return; + } + auto existGod = nebula::value(checkRet); + if (!existGod && !nebula::meta::RootUserMan::initRootUser(gMetaKVStore.get())) { + LOG(ERROR) << "Init root user failed"; + return; } } } diff --git a/src/meta/RootUserMan.h b/src/meta/RootUserMan.h index c1b9d687d69..c8bde933203 100644 --- a/src/meta/RootUserMan.h +++ b/src/meta/RootUserMan.h @@ -20,13 +20,12 @@ namespace meta { * */ class RootUserMan { public: - static bool isGodExists(kvstore::KVStore* kv) { + static ErrorOr isGodExists(kvstore::KVStore* kv) { auto rolePrefix = MetaKeyUtils::roleSpacePrefix(kDefaultSpaceId); std::unique_ptr iter; auto code = kv->prefix(kDefaultSpaceId, kDefaultPartId, rolePrefix, &iter, false); if (code != nebula::cpp2::ErrorCode::SUCCEEDED) { - LOG(INFO) << "Prefix God Role Failed"; - return false; + return code; } while (iter->valid()) { auto val = iter->val();