From 7ca4b9da32ebd0e1a1492f163b77d5bdc2efb60a Mon Sep 17 00:00:00 2001 From: Denis Khalikov Date: Wed, 27 Dec 2023 09:43:27 +0300 Subject: [PATCH] feat(brm): MCOL-5631 Optimize BRM load operation. (#3085) --- versioning/BRM/extentmap.cpp | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/versioning/BRM/extentmap.cpp b/versioning/BRM/extentmap.cpp index a7b7ced4c..bed1f0bce 100644 --- a/versioning/BRM/extentmap.cpp +++ b/versioning/BRM/extentmap.cpp @@ -1584,61 +1584,60 @@ void ExtentMap::loadVersion4or5(T* in, bool upgradeV4ToV5) constexpr const uint32_t freeShmemThreshold = EM_RB_TREE_INITIAL_SIZE >> 4; growEMShmseg(memorySizeNeeded); - size_t progress = 0, writeSize = emNumElements * sizeof(EMEntry); int err; - char* writePos; + size_t progress = 0; if (!upgradeV4ToV5) { - for (uint32_t i = 0; i < emNumElements; ++i) - { - progress = 0; - EMEntry emEntry; - writeSize = sizeof(EMEntry); - writePos = reinterpret_cast(&emEntry); + const size_t readSize = emNumElements * sizeof(EMEntry); + std::unique_ptr emBuffer(new char[readSize]); - while (progress < writeSize) + while (progress < readSize) + { + err = in->read(&emBuffer[progress], readSize - progress); + if (err <= 0) { - err = in->read(writePos + progress, writeSize - progress); - if (err <= 0) - { - log_errno("ExtentMap::loadVersion4(): read "); - throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log."); - } - progress += (uint)err; + log_errno("ExtentMap::loadVersion4(): read "); + throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log."); } + progress += (uint)err; + } + + progress = 0; + for (uint32_t emIndex = 0; emIndex < emNumElements; ++emIndex) + { if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold) growEMShmseg(EM_RB_TREE_INCREMENT); + EMEntry emEntry = *reinterpret_cast(&emBuffer[progress]); std::pair lbidEMEntryPair = make_pair(emEntry.range.start, emEntry); fExtentMapRBTree->insert(lbidEMEntryPair); + progress += sizeof(EMEntry); } } else { - // We are upgrading extent map from v4 to v5. - for (uint32_t i = 0; i < emNumElements; i++) + const size_t readSize = emNumElements * sizeof(EMEntry_v4); + std::unique_ptr emBuffer(new char[readSize]); + + while (progress < readSize) { - EMEntry_v4 emEntryV4; - progress = 0; - writeSize = sizeof(EMEntry_v4); - writePos = reinterpret_cast(&emEntryV4); - - while (progress < writeSize) + err = in->read(&emBuffer[progress], readSize - progress); + if (err <= 0) { - err = in->read(writePos + progress, writeSize - progress); - if (err <= 0) - { - log_errno("ExtentMap::loadVersion4or5(): read "); - throw runtime_error( - "ExtentMap::loadVersion4or5(): read failed during upgrade. Check the error log."); - } - progress += (uint)err; + log_errno("ExtentMap::loadVersion4(): read "); + throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log."); } + progress += (uint)err; + } + progress = 0; + for (uint32_t emIndex = 0; emIndex < emNumElements; ++emIndex) + { if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold) growEMShmseg(EM_RB_TREE_INCREMENT); + EMEntry_v4 emEntryV4 = *reinterpret_cast(&emBuffer[progress]); EMEntry emEntry; emEntry.range.start = emEntryV4.range.start; emEntry.range.size = emEntryV4.range.size; @@ -1657,6 +1656,7 @@ void ExtentMap::loadVersion4or5(T* in, bool upgradeV4ToV5) std::pair lbidEMEntryPair = make_pair(emEntry.range.start, emEntry); fExtentMapRBTree->insert(lbidEMEntryPair); + progress += sizeof(EMEntry_v4); } std::cout << emNumElements << " extents successfully upgraded" << std::endl;