1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

feat(brm): MCOL-5631 Optimize BRM load operation. (#3085)

This commit is contained in:
Denis Khalikov
2023-12-27 09:43:27 +03:00
committed by GitHub
parent 4fa937c086
commit 7ca4b9da32

View File

@ -1584,61 +1584,60 @@ void ExtentMap::loadVersion4or5(T* in, bool upgradeV4ToV5)
constexpr const uint32_t freeShmemThreshold = EM_RB_TREE_INITIAL_SIZE >> 4; constexpr const uint32_t freeShmemThreshold = EM_RB_TREE_INITIAL_SIZE >> 4;
growEMShmseg(memorySizeNeeded); growEMShmseg(memorySizeNeeded);
size_t progress = 0, writeSize = emNumElements * sizeof(EMEntry);
int err; int err;
char* writePos; size_t progress = 0;
if (!upgradeV4ToV5) if (!upgradeV4ToV5)
{ {
for (uint32_t i = 0; i < emNumElements; ++i) const size_t readSize = emNumElements * sizeof(EMEntry);
{ std::unique_ptr<char[]> emBuffer(new char[readSize]);
progress = 0;
EMEntry emEntry;
writeSize = sizeof(EMEntry);
writePos = reinterpret_cast<char*>(&emEntry);
while (progress < writeSize) while (progress < readSize)
{
err = in->read(&emBuffer[progress], readSize - progress);
if (err <= 0)
{ {
err = in->read(writePos + progress, writeSize - progress); log_errno("ExtentMap::loadVersion4(): read ");
if (err <= 0) throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log.");
{
log_errno("ExtentMap::loadVersion4(): read ");
throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log.");
}
progress += (uint)err;
} }
progress += (uint)err;
}
progress = 0;
for (uint32_t emIndex = 0; emIndex < emNumElements; ++emIndex)
{
if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold) if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold)
growEMShmseg(EM_RB_TREE_INCREMENT); growEMShmseg(EM_RB_TREE_INCREMENT);
EMEntry emEntry = *reinterpret_cast<EMEntry*>(&emBuffer[progress]);
std::pair<int64_t, EMEntry> lbidEMEntryPair = make_pair(emEntry.range.start, emEntry); std::pair<int64_t, EMEntry> lbidEMEntryPair = make_pair(emEntry.range.start, emEntry);
fExtentMapRBTree->insert(lbidEMEntryPair); fExtentMapRBTree->insert(lbidEMEntryPair);
progress += sizeof(EMEntry);
} }
} }
else else
{ {
// We are upgrading extent map from v4 to v5. const size_t readSize = emNumElements * sizeof(EMEntry_v4);
for (uint32_t i = 0; i < emNumElements; i++) std::unique_ptr<char[]> emBuffer(new char[readSize]);
while (progress < readSize)
{ {
EMEntry_v4 emEntryV4; err = in->read(&emBuffer[progress], readSize - progress);
progress = 0; if (err <= 0)
writeSize = sizeof(EMEntry_v4);
writePos = reinterpret_cast<char*>(&emEntryV4);
while (progress < writeSize)
{ {
err = in->read(writePos + progress, writeSize - progress); log_errno("ExtentMap::loadVersion4(): read ");
if (err <= 0) throw runtime_error("ExtentMap::loadVersion4(): read failed. Check the error log.");
{
log_errno("ExtentMap::loadVersion4or5(): read ");
throw runtime_error(
"ExtentMap::loadVersion4or5(): read failed during upgrade. Check the error log.");
}
progress += (uint)err;
} }
progress += (uint)err;
}
progress = 0;
for (uint32_t emIndex = 0; emIndex < emNumElements; ++emIndex)
{
if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold) if (fPExtMapRBTreeImpl->getFreeMemory() < freeShmemThreshold)
growEMShmseg(EM_RB_TREE_INCREMENT); growEMShmseg(EM_RB_TREE_INCREMENT);
EMEntry_v4 emEntryV4 = *reinterpret_cast<EMEntry_v4*>(&emBuffer[progress]);
EMEntry emEntry; EMEntry emEntry;
emEntry.range.start = emEntryV4.range.start; emEntry.range.start = emEntryV4.range.start;
emEntry.range.size = emEntryV4.range.size; emEntry.range.size = emEntryV4.range.size;
@ -1657,6 +1656,7 @@ void ExtentMap::loadVersion4or5(T* in, bool upgradeV4ToV5)
std::pair<int64_t, EMEntry> lbidEMEntryPair = make_pair(emEntry.range.start, emEntry); std::pair<int64_t, EMEntry> lbidEMEntryPair = make_pair(emEntry.range.start, emEntry);
fExtentMapRBTree->insert(lbidEMEntryPair); fExtentMapRBTree->insert(lbidEMEntryPair);
progress += sizeof(EMEntry_v4);
} }
std::cout << emNumElements << " extents successfully upgraded" << std::endl; std::cout << emNumElements << " extents successfully upgraded" << std::endl;