You've already forked mariadb-columnstore-engine
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:
@ -1584,22 +1584,17 @@ 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(writePos + progress, writeSize - progress);
|
||||
err = in->read(&emBuffer[progress], readSize - progress);
|
||||
if (err <= 0)
|
||||
{
|
||||
log_errno("ExtentMap::loadVersion4(): read ");
|
||||
@ -1607,38 +1602,42 @@ void ExtentMap::loadVersion4or5(T* in, bool upgradeV4ToV5)
|
||||
}
|
||||
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++)
|
||||
{
|
||||
EMEntry_v4 emEntryV4;
|
||||
progress = 0;
|
||||
writeSize = sizeof(EMEntry_v4);
|
||||
writePos = reinterpret_cast<char*>(&emEntryV4);
|
||||
const size_t readSize = emNumElements * sizeof(EMEntry_v4);
|
||||
std::unique_ptr<char[]> emBuffer(new char[readSize]);
|
||||
|
||||
while (progress < writeSize)
|
||||
while (progress < readSize)
|
||||
{
|
||||
err = in->read(writePos + progress, writeSize - progress);
|
||||
err = in->read(&emBuffer[progress], readSize - progress);
|
||||
if (err <= 0)
|
||||
{
|
||||
log_errno("ExtentMap::loadVersion4or5(): read ");
|
||||
throw runtime_error(
|
||||
"ExtentMap::loadVersion4or5(): read failed during upgrade. Check the error log.");
|
||||
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;
|
||||
|
Reference in New Issue
Block a user