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,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;
|
||||||
|
Reference in New Issue
Block a user