1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-27 21:01:50 +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;
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<char*>(&emEntry);
const size_t readSize = emNumElements * sizeof(EMEntry);
std::unique_ptr<char[]> 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<EMEntry*>(&emBuffer[progress]);
std::pair<int64_t, EMEntry> 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<char[]> emBuffer(new char[readSize]);
while (progress < readSize)
{
EMEntry_v4 emEntryV4;
progress = 0;
writeSize = sizeof(EMEntry_v4);
writePos = reinterpret_cast<char*>(&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<EMEntry_v4*>(&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<int64_t, EMEntry> lbidEMEntryPair = make_pair(emEntry.range.start, emEntry);
fExtentMapRBTree->insert(lbidEMEntryPair);
progress += sizeof(EMEntry_v4);
}
std::cout << emNumElements << " extents successfully upgraded" << std::endl;