From 9941a85b8ae17e12d232047b9a613594e99c3275 Mon Sep 17 00:00:00 2001 From: Nivras <12605142+Nivras@users.noreply.github.com> Date: Mon, 6 Dec 2021 16:41:23 +0800 Subject: [PATCH 1/3] parse diskPartsKey and add unit test --- src/common/utils/MetaKeyUtils.cpp | 29 +++++++++++++++++-- src/common/utils/MetaKeyUtils.h | 8 ++++-- src/common/utils/test/MetaKeyUtilsTest.cpp | 11 ++++++++ src/kvstore/test/DiskManagerTest.cpp | 33 ++++++++++++++++++++++ 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/common/utils/MetaKeyUtils.cpp b/src/common/utils/MetaKeyUtils.cpp index b070cf40731..b9fffa0360e 100644 --- a/src/common/utils/MetaKeyUtils.cpp +++ b/src/common/utils/MetaKeyUtils.cpp @@ -1152,9 +1152,30 @@ GraphSpaceID MetaKeyUtils::parseLocalIdSpace(folly::StringPiece rawData) { return *reinterpret_cast(rawData.data() + offset); } -GraphSpaceID MetaKeyUtils::parseDiskPartsSpace(folly::StringPiece rawData) { +HostAddr MetaKeyUtils::parseDiskPartsHost(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - return *reinterpret_cast(rawData.data() + offset); + size_t len = *reinterpret_cast(rawData.begin() + offset); + std::string hostStr; + hostStr.reserve(sizeof(size_t) + len + sizeof(Port)); + hostStr.append(rawData.begin() + offset, sizeof(size_t) + len + sizeof(Port)); + return deserializeHostAddr(hostStr); +} + +GraphSpaceID MetaKeyUtils::parseDiskPartsSpace(const folly::StringPiece& rawData) { + auto offset = kDiskPartsTable.size(); + size_t len = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + len + sizeof(Port); + return *reinterpret_cast(rawData.begin() + offset); +} + +std::string MetaKeyUtils::parseDiskPartsPath(const folly::StringPiece& rawData) { + auto offset = kDiskPartsTable.size(); + size_t len = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + len + sizeof(Port) + sizeof(GraphSpaceID); + std::string path; + path.reserve(rawData.size() - offset); + path.append(rawData.begin() + offset, rawData.size() - offset); + return path; } std::string MetaKeyUtils::diskPartsPrefix() { return kDiskPartsTable; } @@ -1176,7 +1197,9 @@ std::string MetaKeyUtils::diskPartsPrefix(HostAddr addr, GraphSpaceID spaceId) { return key; } -std::string MetaKeyUtils::diskPartsKey(HostAddr addr, GraphSpaceID spaceId, std::string path) { +std::string MetaKeyUtils::diskPartsKey(HostAddr addr, + GraphSpaceID spaceId, + const std::string& path) { std::string key; std::string prefix = diskPartsPrefix(addr, spaceId); key.reserve(prefix.size() + path.size()); diff --git a/src/common/utils/MetaKeyUtils.h b/src/common/utils/MetaKeyUtils.h index 29fa715771b..ee698d3dffa 100644 --- a/src/common/utils/MetaKeyUtils.h +++ b/src/common/utils/MetaKeyUtils.h @@ -376,7 +376,11 @@ class MetaKeyUtils final { static std::unordered_map> getSystemTableMaps(); - static GraphSpaceID parseDiskPartsSpace(folly::StringPiece rawData); + static GraphSpaceID parseDiskPartsSpace(const folly::StringPiece& rawData); + + static HostAddr parseDiskPartsHost(const folly::StringPiece& rawData); + + static std::string parseDiskPartsPath(const folly::StringPiece& rawData); static std::string diskPartsPrefix(); @@ -384,7 +388,7 @@ class MetaKeyUtils final { static std::string diskPartsPrefix(HostAddr addr, GraphSpaceID spaceId); - static std::string diskPartsKey(HostAddr addr, GraphSpaceID spaceId, std::string path); + static std::string diskPartsKey(HostAddr addr, GraphSpaceID spaceId, const std::string& path); static std::string diskPartsVal(const meta::cpp2::PartitionList& partList); diff --git a/src/common/utils/test/MetaKeyUtilsTest.cpp b/src/common/utils/test/MetaKeyUtilsTest.cpp index 26945701112..a3bc910c80d 100644 --- a/src/common/utils/test/MetaKeyUtilsTest.cpp +++ b/src/common/utils/test/MetaKeyUtilsTest.cpp @@ -201,6 +201,17 @@ TEST(MetaKeyUtilsTest, ZoneTest) { ASSERT_EQ(nodes, MetaKeyUtils::parseZoneHosts(zoneValue)); } +TEST(MetaKeyUtilsTest, DiskPathsTest) { + HostAddr addr{"192.168.0.1", 1234}; + GraphSpaceID spaceId = 1; + std::string path = "/data/storage/test_part1"; + + auto diskPartsKey = MetaKeyUtils::diskPartsKey(addr, spaceId, path); + ASSERT_EQ(addr, MetaKeyUtils::parseDiskPartsHost(diskPartsKey)); + ASSERT_EQ(spaceId, MetaKeyUtils::parseDiskPartsSpace(diskPartsKey)); + ASSERT_EQ(path, MetaKeyUtils::parseDiskPartsPath(diskPartsKey)); +} + } // namespace nebula int main(int argc, char** argv) { diff --git a/src/kvstore/test/DiskManagerTest.cpp b/src/kvstore/test/DiskManagerTest.cpp index df95bb0aa0b..93435537b20 100644 --- a/src/kvstore/test/DiskManagerTest.cpp +++ b/src/kvstore/test/DiskManagerTest.cpp @@ -145,6 +145,39 @@ TEST(DiskManagerTest, WalNoSpaceTest) { } } +TEST(DiskManagerTest, GetDiskPartsTest) { + GraphSpaceID spaceId = 1; + fs::TempDir disk1("/tmp/get_disk_part_test.XXXXXX"); + auto path1 = folly::stringPrintf("%s/nebula/%d", disk1.path(), spaceId); + boost::filesystem::create_directories(path1); + fs::TempDir disk2("/tmp/get_disk_part_test.XXXXXX"); + auto path2 = folly::stringPrintf("%s/nebula/%d", disk2.path(), spaceId); + boost::filesystem::create_directories(path2); + GraphSpaceID spaceId2 = 2; + fs::TempDir disk3("/tmp/get_disk_part_test.XXXXXX"); + auto path3 = folly::stringPrintf("%s/nebula/%d", disk3.path(), spaceId2); + boost::filesystem::create_directories(path3); + + std::vector dataPaths = {disk1.path(), disk2.path(), disk3.path()}; + DiskManager diskMan(dataPaths); + for (PartitionID partId = 1; partId <= 10; partId++) { + diskMan.addPartToPath(spaceId, partId, path1); + } + for (PartitionID partId = 11; partId <= 20; partId++) { + diskMan.addPartToPath(spaceId, partId, path2); + } + for (PartitionID partId = 1; partId <= 10; partId++) { + diskMan.addPartToPath(spaceId2, partId, path3); + } + + SpaceDiskPartsMap diskParts; + diskMan.getDiskParts(diskParts); + ASSERT_EQ(2, diskParts.size()); + ASSERT_EQ(2, diskParts[spaceId].size()); + ASSERT_EQ(1, diskParts[spaceId2].size()); + ASSERT_EQ(10, diskParts[spaceId2][path3].get_part_list().size()); +} + } // namespace kvstore } // namespace nebula From f04e00d5fb0d01b603df0e96c65572cd637ba972 Mon Sep 17 00:00:00 2001 From: Nivras <12605142+Nivras@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:26:31 +0800 Subject: [PATCH 2/3] add comments --- src/common/utils/MetaKeyUtils.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/common/utils/MetaKeyUtils.cpp b/src/common/utils/MetaKeyUtils.cpp index b9fffa0360e..63535c5c958 100644 --- a/src/common/utils/MetaKeyUtils.cpp +++ b/src/common/utils/MetaKeyUtils.cpp @@ -1152,26 +1152,34 @@ GraphSpaceID MetaKeyUtils::parseLocalIdSpace(folly::StringPiece rawData) { return *reinterpret_cast(rawData.data() + offset); } +/** + * diskPartsKey = kDiskPartsTable + serializeHostAddr(HostAddr) + SpaceId + diskPath + * kDiskPartsTable = "__disk_parts__" + * HostAddr : see serializeHostAddr(), HostAddr = len(host.ip) + host.ip + host.port + * SpaceId: int32_t + * diskPath: string like "/data/storage/1/nebula/part_1" + */ + HostAddr MetaKeyUtils::parseDiskPartsHost(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t len = *reinterpret_cast(rawData.begin() + offset); - std::string hostStr; - hostStr.reserve(sizeof(size_t) + len + sizeof(Port)); - hostStr.append(rawData.begin() + offset, sizeof(size_t) + len + sizeof(Port)); - return deserializeHostAddr(hostStr); + size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); + std::string hostAddrStr; + hostAddrStr.reserve(sizeof(size_t) + hostIpLen + sizeof(Port)); + hostAddrStr.append(rawData.begin() + offset, sizeof(size_t) + hostIpLen + sizeof(Port)); + return deserializeHostAddr(hostAddrStr); } GraphSpaceID MetaKeyUtils::parseDiskPartsSpace(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t len = *reinterpret_cast(rawData.begin() + offset); - offset += sizeof(size_t) + len + sizeof(Port); + size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + hostIpLen + sizeof(Port); return *reinterpret_cast(rawData.begin() + offset); } std::string MetaKeyUtils::parseDiskPartsPath(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t len = *reinterpret_cast(rawData.begin() + offset); - offset += sizeof(size_t) + len + sizeof(Port) + sizeof(GraphSpaceID); + size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + hostIpLen + sizeof(Port) + sizeof(GraphSpaceID); std::string path; path.reserve(rawData.size() - offset); path.append(rawData.begin() + offset, rawData.size() - offset); From 378251e77847dc21c10a2ed502ec4c08a7a1cd85 Mon Sep 17 00:00:00 2001 From: Nivras <12605142+Nivras@users.noreply.github.com> Date: Tue, 7 Dec 2021 16:18:48 +0800 Subject: [PATCH 3/3] change diskPartsKey to tableName + len(hostAddrStr) + hostAddrStr + spaceId + path --- src/common/utils/MetaKeyUtils.cpp | 32 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/common/utils/MetaKeyUtils.cpp b/src/common/utils/MetaKeyUtils.cpp index 63535c5c958..48ed50172c1 100644 --- a/src/common/utils/MetaKeyUtils.cpp +++ b/src/common/utils/MetaKeyUtils.cpp @@ -1153,36 +1153,29 @@ GraphSpaceID MetaKeyUtils::parseLocalIdSpace(folly::StringPiece rawData) { } /** - * diskPartsKey = kDiskPartsTable + serializeHostAddr(HostAddr) + SpaceId + diskPath - * kDiskPartsTable = "__disk_parts__" - * HostAddr : see serializeHostAddr(), HostAddr = len(host.ip) + host.ip + host.port - * SpaceId: int32_t - * diskPath: string like "/data/storage/1/nebula/part_1" + * diskPartsKey = kDiskPartsTable + len(serialized(hostAddr)) + serialized(hostAddr) + path */ HostAddr MetaKeyUtils::parseDiskPartsHost(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); - std::string hostAddrStr; - hostAddrStr.reserve(sizeof(size_t) + hostIpLen + sizeof(Port)); - hostAddrStr.append(rawData.begin() + offset, sizeof(size_t) + hostIpLen + sizeof(Port)); + auto hostAddrLen = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t); + std::string hostAddrStr(rawData.data() + offset, hostAddrLen); return deserializeHostAddr(hostAddrStr); } GraphSpaceID MetaKeyUtils::parseDiskPartsSpace(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); - offset += sizeof(size_t) + hostIpLen + sizeof(Port); + size_t hostAddrLen = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + hostAddrLen; return *reinterpret_cast(rawData.begin() + offset); } std::string MetaKeyUtils::parseDiskPartsPath(const folly::StringPiece& rawData) { auto offset = kDiskPartsTable.size(); - size_t hostIpLen = *reinterpret_cast(rawData.begin() + offset); - offset += sizeof(size_t) + hostIpLen + sizeof(Port) + sizeof(GraphSpaceID); - std::string path; - path.reserve(rawData.size() - offset); - path.append(rawData.begin() + offset, rawData.size() - offset); + size_t hostAddrLen = *reinterpret_cast(rawData.begin() + offset); + offset += sizeof(size_t) + hostAddrLen + sizeof(GraphSpaceID); + std::string path(rawData.begin() + offset, rawData.size() - offset); return path; } @@ -1191,8 +1184,11 @@ std::string MetaKeyUtils::diskPartsPrefix() { return kDiskPartsTable; } std::string MetaKeyUtils::diskPartsPrefix(HostAddr addr) { std::string key; std::string hostStr = serializeHostAddr(addr); - key.reserve(kDiskPartsTable.size() + hostStr.size()); - key.append(kDiskPartsTable.data(), kDiskPartsTable.size()).append(hostStr.data(), hostStr.size()); + size_t hostAddrLen = hostStr.size(); + key.reserve(kDiskPartsTable.size() + sizeof(size_t) + hostStr.size()); + key.append(kDiskPartsTable.data(), kDiskPartsTable.size()) + .append(reinterpret_cast(&hostAddrLen), sizeof(size_t)) + .append(hostStr.data(), hostStr.size()); return key; }