1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-27 21:01:50 +03:00

MCOL-5091/MCOL-4917 ExtentMap as RBTree.

This patch replaces a `linear array` to `Red black tree` for ExtentMap.
This commit is contained in:
Denis Khalikov
2022-08-18 22:51:26 +03:00
parent 4e2d4984cf
commit 2f5f9cdbe1
5 changed files with 1781 additions and 1854 deletions

View File

@ -408,5 +408,117 @@ void BRMManagedShmImpl::remap(const bool readOnly)
fShmSegment = new bi::managed_shared_memory(bi::open_only, keyName.c_str()); fShmSegment = new bi::managed_shared_memory(bi::open_only, keyName.c_str());
} }
} // namespace BRM BRMManagedShmImplRBTree::BRMManagedShmImplRBTree(unsigned key, off_t size, bool readOnly)
: BRMShmImplParent(key, size, readOnly)
{
// FIXME: Take a right size.
// Actually this means to open a segment at the default code.
if (fSize == 0)
fSize = 64000;
try
{
bi::permissions perms;
perms.set_unrestricted();
fShmSegment = new boost::interprocess::managed_shared_memory(boost::interprocess::open_or_create,
segmentName, fSize, 0, perms);
fSize = fShmSegment->get_size();
}
catch (exception& e)
{
std::cout << "Cannot create boost::interprocess::managed_shared_memory object: " << e.what() << std::endl;
}
}
BRMManagedShmImplRBTree::~BRMManagedShmImplRBTree()
{
}
void BRMManagedShmImplRBTree::setReadOnly()
{
try
{
if (fShmSegment)
{
delete fShmSegment;
fShmSegment = new bi::managed_shared_memory(bi::open_read_only, segmentName);
fReadOnly = true;
}
}
catch (exception& e)
{
std::cout << "BRMManagedShmImpl::setReadOnly() error " << e.what() << std::endl;
throw;
}
}
int32_t BRMManagedShmImplRBTree::grow(unsigned key, off_t incSize)
{
try
{
if (fShmSegment)
{
// Update key for this process.
fKey = key;
// Call destructor to unmap the segment.
delete fShmSegment;
// Grow the segment.
bi::managed_shared_memory::grow(segmentName, incSize);
// Open only.
fShmSegment = new bi::managed_shared_memory(bi::open_only, segmentName);
// Update size.
fSize = fShmSegment->get_size();
}
}
catch (exception& e)
{
std::cout << "BRMManagedShmImpl::grow() error " << e.what() << std::endl;
throw;
}
return 0;
}
// Dummy method that has no references in the code.
int BRMManagedShmImplRBTree::clear(unsigned newKey, off_t newSize)
{
return 0;
}
void BRMManagedShmImplRBTree::reMapSegment()
{
try
{
if (fShmSegment)
{
// Call destructor to unmap the segment.
delete fShmSegment;
// Map.
fShmSegment = new bi::managed_shared_memory(bi::open_only, segmentName);
// Update size.
fSize = fShmSegment->get_size();
}
}
catch (exception& e)
{
std::cout << "BRMManagedShmImpl::remap() error " << e.what() << std::endl;
throw;
}
}
void BRMManagedShmImplRBTree::destroy()
{
try
{
bi::shared_memory_object::remove(segmentName);
}
catch (exception& e)
{
std::cout << "BRMManagedShmImplRBTree::destroy() " << std::endl;
throw;
}
}
} // namespace BRM

View File

@ -115,4 +115,23 @@ class BRMManagedShmImpl : public BRMShmImplParent
bi::managed_shared_memory* fShmSegment; bi::managed_shared_memory* fShmSegment;
}; };
class BRMManagedShmImplRBTree : public BRMShmImplParent
{
public:
BRMManagedShmImplRBTree(unsigned key, off_t size, bool readOnly = false);
~BRMManagedShmImplRBTree();
void setReadOnly() override;
int32_t grow(unsigned key, off_t incSize);
void destroy() override;
void reMapSegment();
int clear(unsigned newKey, off_t newSize) override;
boost::interprocess::managed_shared_memory* fShmSegment;
private:
// The `segment` name is fixed.
const char* segmentName = "MCS-shm-00020001";
};
} // namespace BRM } // namespace BRM

View File

@ -108,7 +108,7 @@ class DBRM
EXPORT static void refreshShm() EXPORT static void refreshShm()
{ {
MasterSegmentTableImpl::refreshShm(); MasterSegmentTableImpl::refreshShm();
ExtentMapImpl::refreshShm(); ExtentMapRBTreeImpl::refreshShm();
FreeListImpl::refreshShm(); FreeListImpl::refreshShm();
} }

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,7 @@
#include <boost/functional/hash.hpp> //boost::hash #include <boost/functional/hash.hpp> //boost::hash
#include <boost/interprocess/allocators/allocator.hpp> #include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/vector.hpp> #include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/managed_shared_memory.hpp> #include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp> #include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/shared_memory_object.hpp> #include <boost/interprocess/shared_memory_object.hpp>
@ -212,12 +213,52 @@ struct ExtentSorter
} }
}; };
class ExtentMapImpl using ShmSegmentManagerT = bi::managed_shared_memory::segment_manager;
using ShmVoidAllocator = bi::allocator<void, ShmSegmentManagerT>;
using LBID_tAlloc = bi::allocator<LBID_t, ShmSegmentManagerT>;
using PartitionNumberTAlloc = bi::allocator<PartitionNumberT, ShmSegmentManagerT>;
using LBID_tVectorT = bi::vector<LBID_t, LBID_tAlloc>;
using PartitionIndexContainerKeyT = PartitionNumberT;
using PartitionIndexContainerValT = std::pair<const PartitionIndexContainerKeyT, LBID_tVectorT>;
using PartitionIndexContainerValTAlloc = bi::allocator<PartitionIndexContainerValT, ShmSegmentManagerT>;
// Can't use std::unordered_map presumably b/c the map's pointer type doesn't use offset_type as boost::u_map
// does
using PartitionIndexContainerT =
boost::unordered_map<PartitionIndexContainerKeyT, LBID_tVectorT, boost::hash<PartitionIndexContainerKeyT>,
std::equal_to<PartitionIndexContainerKeyT>, PartitionIndexContainerValTAlloc>;
using OIDIndexContainerKeyT = OID_t;
using OIDIndexContainerValT = std::pair<const OIDIndexContainerKeyT, PartitionIndexContainerT>;
using OIDIndexContainerValTAlloc = bi::allocator<OIDIndexContainerValT, ShmSegmentManagerT>;
using OIDIndexContainerT =
boost::unordered_map<OIDIndexContainerKeyT, PartitionIndexContainerT, boost::hash<OIDIndexContainerKeyT>,
std::equal_to<OIDIndexContainerKeyT>, OIDIndexContainerValTAlloc>;
using DBRootIndexTAlloc = bi::allocator<OIDIndexContainerT, ShmSegmentManagerT>;
using DBRootIndexContainerT = bi::vector<OIDIndexContainerT, DBRootIndexTAlloc>;
using ExtentMapIndex = DBRootIndexContainerT;
using LBID_tFindResult = bi::vector<LBID_t>;
using InsertUpdateShmemKeyPair = std::pair<bool, bool>;
// RBTREE.
using EMEntryKeyValueType = std::pair<const int64_t, EMEntry>;
using VoidAllocator =
boost::interprocess::allocator<void, boost::interprocess::managed_shared_memory::segment_manager>;
using EMEntryKeyValueTypeAllocator =
boost::interprocess::allocator<EMEntryKeyValueType,
boost::interprocess::managed_shared_memory::segment_manager>;
using ExtentMapRBTree =
boost::interprocess::map<int64_t, EMEntry, std::less<int64_t>, EMEntryKeyValueTypeAllocator>;
class ExtentMapRBTreeImpl
{ {
public: public:
~ExtentMapImpl(){}; ~ExtentMapRBTreeImpl() = default;
static ExtentMapRBTreeImpl* makeExtentMapRBTreeImpl(unsigned key, off_t size, bool readOnly = false);
static ExtentMapImpl* makeExtentMapImpl(unsigned key, off_t size, bool readOnly = false);
static void refreshShm() static void refreshShm()
{ {
if (fInstance) if (fInstance)
@ -228,48 +269,40 @@ class ExtentMapImpl
} }
inline void grow(unsigned key, off_t size) inline void grow(unsigned key, off_t size)
#ifdef NDEBUG
{ {
fExtMap.grow(key, size); fManagedShm.grow(key, size);
}
#else
{
int rc = fExtMap.grow(key, size);
idbassert(rc == 0);
}
#endif
inline void makeReadOnly()
{
fExtMap.setReadOnly();
}
inline void clear(unsigned key, off_t size)
{
fExtMap.clear(key, size);
}
inline void swapout(BRMShmImpl& rhs)
{
fExtMap.swap(rhs);
rhs.destroy();
}
inline unsigned key() const
{
return fExtMap.key();
} }
inline EMEntry* get() const inline unsigned key() const
{ {
return reinterpret_cast<EMEntry*>(fExtMap.fMapreg.get_address()); return fManagedShm.key();
}
inline ExtentMapRBTree* get() const
{
VoidAllocator allocator(fManagedShm.fShmSegment->get_segment_manager());
return fManagedShm.fShmSegment->find_or_construct<ExtentMapRBTree>("EmMapRBTree")(std::less<LBID_t>(),
allocator);
}
inline uint64_t getFreeMemory() const
{
return fManagedShm.fShmSegment->get_free_memory();
}
inline uint64_t getSize() const
{
return fManagedShm.fShmSegment->get_size();
} }
private: private:
ExtentMapImpl(unsigned key, off_t size, bool readOnly = false); ExtentMapRBTreeImpl(unsigned key, off_t size, bool readOnly = false);
ExtentMapImpl(const ExtentMapImpl& rhs); ExtentMapRBTreeImpl(const ExtentMapRBTreeImpl& rhs);
ExtentMapImpl& operator=(const ExtentMapImpl& rhs); ExtentMapRBTreeImpl& operator=(const ExtentMapRBTreeImpl& rhs);
BRMShmImpl fExtMap; BRMManagedShmImplRBTree fManagedShm;
static boost::mutex fInstanceMutex; static boost::mutex fInstanceMutex;
static ExtentMapImpl* fInstance; static ExtentMapRBTreeImpl* fInstance;
}; };
class FreeListImpl class FreeListImpl
@ -332,37 +365,6 @@ class FreeListImpl
static FreeListImpl* fInstance; static FreeListImpl* fInstance;
}; };
using ShmSegmentManagerT = bi::managed_shared_memory::segment_manager;
using ShmVoidAllocator = bi::allocator<void, ShmSegmentManagerT>;
using ExtentMapIdxT = size_t;
using ExtentMapIdxTAlloc = bi::allocator<ExtentMapIdxT, ShmSegmentManagerT>;
using PartitionNumberTAlloc = bi::allocator<PartitionNumberT, ShmSegmentManagerT>;
using ExtentMapIndicesT = bi::vector<ExtentMapIdxT, ExtentMapIdxTAlloc>;
using PartitionIndexContainerKeyT = PartitionNumberT;
using PartitionIndexContainerValT = std::pair<const PartitionIndexContainerKeyT, ExtentMapIndicesT>;
using PartitionIndexContainerValTAlloc = bi::allocator<PartitionIndexContainerValT, ShmSegmentManagerT>;
// Can't use std::unordered_map presumably b/c the map's pointer type doesn't use offset_type as boost::u_map
// does
using PartitionIndexContainerT =
boost::unordered_map<PartitionIndexContainerKeyT, ExtentMapIndicesT,
boost::hash<PartitionIndexContainerKeyT>, std::equal_to<PartitionIndexContainerKeyT>,
PartitionIndexContainerValTAlloc>;
using OIDIndexContainerKeyT = OID_t;
using OIDIndexContainerValT = std::pair<const OIDIndexContainerKeyT, PartitionIndexContainerT>;
using OIDIndexContainerValTAlloc = bi::allocator<OIDIndexContainerValT, ShmSegmentManagerT>;
using OIDIndexContainerT =
boost::unordered_map<OIDIndexContainerKeyT, PartitionIndexContainerT, boost::hash<OIDIndexContainerKeyT>,
std::equal_to<OIDIndexContainerKeyT>, OIDIndexContainerValTAlloc>;
using DBRootIndexTAlloc = bi::allocator<OIDIndexContainerT, ShmSegmentManagerT>;
using DBRootIndexContainerT = bi::vector<OIDIndexContainerT, DBRootIndexTAlloc>;
using ExtentMapIndex = DBRootIndexContainerT;
using ExtentMapIndexFindResult = bi::vector<ExtentMapIdxT>;
using InsertUpdateShmemKeyPair = std::pair<bool, bool>;
class ExtentMapIndexImpl class ExtentMapIndexImpl
{ {
public: public:
@ -435,26 +437,26 @@ class ExtentMapIndexImpl
void createExtentMapIndexIfNeeded(); void createExtentMapIndexIfNeeded();
ExtentMapIndex* get(); ExtentMapIndex* get();
InsertUpdateShmemKeyPair insert(const EMEntry& emEntry, const size_t emIdx); InsertUpdateShmemKeyPair insert(const EMEntry& emEntry, const LBID_t lbid);
InsertUpdateShmemKeyPair insert2ndLayerWrapper(OIDIndexContainerT& oids, const EMEntry& emEntry, InsertUpdateShmemKeyPair insert2ndLayerWrapper(OIDIndexContainerT& oids, const EMEntry& emEntry,
const size_t emIdx, const bool aShmemHasGrown); const LBID_t lbid, const bool aShmemHasGrown);
InsertUpdateShmemKeyPair insert2ndLayer(OIDIndexContainerT& oids, const EMEntry& emEntry, InsertUpdateShmemKeyPair insert2ndLayer(OIDIndexContainerT& oids, const EMEntry& emEntry, const LBID_t lbid,
const size_t emIdx, const bool aShmemHasGrown); const bool aShmemHasGrown);
InsertUpdateShmemKeyPair insert3dLayerWrapper(PartitionIndexContainerT& partitions, const EMEntry& emEntry, InsertUpdateShmemKeyPair insert3dLayerWrapper(PartitionIndexContainerT& partitions, const EMEntry& emEntry,
const size_t emIdx, const bool aShmemHasGrown); const LBID_t lbid, const bool aShmemHasGrown);
InsertUpdateShmemKeyPair insert3dLayer(PartitionIndexContainerT& partitions, const EMEntry& emEntry, InsertUpdateShmemKeyPair insert3dLayer(PartitionIndexContainerT& partitions, const EMEntry& emEntry,
const size_t emIdx, const bool aShmemHasGrown); const LBID_t lbid, const bool aShmemHasGrown);
ExtentMapIndexFindResult find(const DBRootT dbroot, const OID_t oid, LBID_tFindResult find(const DBRootT dbroot, const OID_t oid, const PartitionNumberT partitionNumber);
const PartitionNumberT partitionNumber); LBID_tFindResult find(const DBRootT dbroot, const OID_t oid);
ExtentMapIndexFindResult find(const DBRootT dbroot, const OID_t oid); LBID_tFindResult search2ndLayer(OIDIndexContainerT& oids, const OID_t oid,
ExtentMapIndexFindResult search2ndLayer(OIDIndexContainerT& oids, const OID_t oid, const PartitionNumberT partitionNumber);
const PartitionNumberT partitionNumber); LBID_tFindResult search2ndLayer(OIDIndexContainerT& oids, const OID_t oid);
ExtentMapIndexFindResult search2ndLayer(OIDIndexContainerT& oids, const OID_t oid); LBID_tFindResult search3dLayer(PartitionIndexContainerT& partitions,
ExtentMapIndexFindResult search3dLayer(PartitionIndexContainerT& partitions, const PartitionNumberT partitionNumber);
const PartitionNumberT partitionNumber); bool isDBRootEmpty(const DBRootT dbroot);
void deleteDbRoot(const DBRootT dbroot); void deleteDbRoot(const DBRootT dbroot);
void deleteOID(const DBRootT dbroot, const OID_t oid); void deleteOID(const DBRootT dbroot, const OID_t oid);
void deleteEMEntry(const EMEntry& emEntry, const ExtentMapIdxT emIdent); void deleteEMEntry(const EMEntry& emEntry, const LBID_t lbid);
private: private:
BRMManagedShmImpl fBRMManagedShmMemImpl_; BRMManagedShmImpl fBRMManagedShmMemImpl_;
@ -1025,13 +1027,13 @@ class ExtentMap : public Undoable
inline bool empty() inline bool empty()
{ {
if (fEMShminfo == 0) if (fEMRBTreeShminfo == nullptr)
{ {
grabEMEntryTable(BRM::ExtentMap::READ); grabEMEntryTable(BRM::ExtentMap::READ);
releaseEMEntryTable(BRM::ExtentMap::READ); releaseEMEntryTable(BRM::ExtentMap::READ);
} }
// Initial size.
return (fEMShminfo->currentSize == 0); return (fEMRBTreeShminfo->currentSize == EM_RB_TREE_EMPTY_SIZE);
} }
EXPORT std::vector<InlineLBIDRange> getFreeListEntries(); EXPORT std::vector<InlineLBIDRange> getFreeListEntries();
@ -1051,22 +1053,38 @@ class ExtentMap : public Undoable
#endif #endif
private: private:
static const constexpr size_t EM_INCREMENT_ROWS = 100; enum class UndoRecordType
{
DEFAULT,
INSERT,
DELETE
};
static const constexpr size_t EM_INCREMENT_ROWS = 1000;
static const constexpr size_t EM_INITIAL_SIZE = EM_INCREMENT_ROWS * 10 * sizeof(EMEntry); static const constexpr size_t EM_INITIAL_SIZE = EM_INCREMENT_ROWS * 10 * sizeof(EMEntry);
static const constexpr size_t EM_INCREMENT = EM_INCREMENT_ROWS * sizeof(EMEntry); static const constexpr size_t EM_INCREMENT = EM_INCREMENT_ROWS * sizeof(EMEntry);
static const constexpr size_t EM_FREELIST_INITIAL_SIZE = 50 * sizeof(InlineLBIDRange); static const constexpr size_t EM_FREELIST_INITIAL_SIZE = 50 * sizeof(InlineLBIDRange);
static const constexpr size_t EM_FREELIST_INCREMENT = 50 * sizeof(InlineLBIDRange); static const constexpr size_t EM_FREELIST_INCREMENT = 50 * sizeof(InlineLBIDRange);
// RBTree constants.
static const size_t EM_RB_TREE_NODE_SIZE = 10 * (sizeof(EMEntry) + 8 * sizeof(uint64_t));
static const size_t EM_RB_TREE_EMPTY_SIZE = 1024;
static const size_t EM_RB_TREE_INITIAL_SIZE =
EM_INCREMENT_ROWS * 10 * EM_RB_TREE_NODE_SIZE + EM_RB_TREE_EMPTY_SIZE;
static const size_t EM_RB_TREE_INCREMENT = EM_INCREMENT_ROWS * EM_RB_TREE_NODE_SIZE;
ExtentMap(const ExtentMap& em); ExtentMap(const ExtentMap& em);
ExtentMap& operator=(const ExtentMap& em); ExtentMap& operator=(const ExtentMap& em);
EMEntry* fExtentMap; ExtentMapRBTree* fExtentMapRBTree;
InlineLBIDRange* fFreeList; InlineLBIDRange* fFreeList;
key_t fCurrentEMShmkey; key_t fCurrentEMShmkey;
key_t fCurrentFLShmkey; key_t fCurrentFLShmkey;
MSTEntry* fEMShminfo;
MSTEntry* fEMRBTreeShminfo;
MSTEntry* fFLShminfo; MSTEntry* fFLShminfo;
MSTEntry* fEMIndexShminfo; MSTEntry* fEMIndexShminfo;
const MasterSegmentTable fMST; const MasterSegmentTable fMST;
bool r_only; bool r_only;
typedef std::tr1::unordered_map<int, oam::DBRootConfigList*> PmDbRootMap_t; typedef std::tr1::unordered_map<int, oam::DBRootConfigList*> PmDbRootMap_t;
@ -1075,6 +1093,7 @@ class ExtentMap : public Undoable
int numUndoRecords; int numUndoRecords;
bool flLocked, emLocked, emIndexLocked; bool flLocked, emLocked, emIndexLocked;
static boost::mutex mutex; // @bug5355 - made mutex static static boost::mutex mutex; // @bug5355 - made mutex static
static boost::mutex emIndexMutex; static boost::mutex emIndexMutex;
boost::mutex fConfigCacheMutex; // protect access to Config Cache boost::mutex fConfigCacheMutex; // protect access to Config Cache
@ -1094,6 +1113,7 @@ class ExtentMap : public Undoable
void logAndSetEMIndexReadOnly(const std::string& funcName); void logAndSetEMIndexReadOnly(const std::string& funcName);
// Create extents.
LBID_t _createColumnExtent_DBroot(uint32_t size, int OID, uint32_t colWidth, uint16_t dbRoot, LBID_t _createColumnExtent_DBroot(uint32_t size, int OID, uint32_t colWidth, uint16_t dbRoot,
execplan::CalpontSystemCatalog::ColDataType colDataType, execplan::CalpontSystemCatalog::ColDataType colDataType,
uint32_t& partitionNum, uint16_t& segmentNum, uint32_t& startBlockOffset); uint32_t& partitionNum, uint16_t& segmentNum, uint32_t& startBlockOffset);
@ -1103,27 +1123,43 @@ class ExtentMap : public Undoable
uint32_t& startBlockOffset); uint32_t& startBlockOffset);
LBID_t _createDictStoreExtent(uint32_t size, int OID, uint16_t dbRoot, uint32_t partitionNum, LBID_t _createDictStoreExtent(uint32_t size, int OID, uint16_t dbRoot, uint32_t partitionNum,
uint16_t segmentNum); uint16_t segmentNum);
// Delete extent.
ExtentMapRBTree::iterator deleteExtent(ExtentMapRBTree::iterator it, const bool clearEMIndex = true);
template <typename T> template <typename T>
bool isValidCPRange(const T& max, const T& min, execplan::CalpontSystemCatalog::ColDataType type) const; bool isValidCPRange(const T& max, const T& min, execplan::CalpontSystemCatalog::ColDataType type) const;
void deleteExtent(const int emIndex, const bool clearEMIndex = true);
LBID_t getLBIDsFromFreeList(uint32_t size); LBID_t getLBIDsFromFreeList(uint32_t size);
void reserveLBIDRange(LBID_t start, uint8_t size); // used by load() to allocate pre-existing LBIDs void reserveLBIDRange(LBID_t start, uint8_t size); // used by load() to allocate pre-existing LBIDs
std::vector<EMEntry> getEmIdentsByLbids(const bi::vector<LBID_t>& lbids);
std::vector<ExtentMapRBTree::iterator> getEmIteratorsByLbids(const bi::vector<LBID_t>& lbids);
// Choose keys.
key_t chooseEMShmkey(); key_t chooseEMShmkey();
key_t chooseFLShmkey(); key_t chooseFLShmkey();
key_t chooseEMIndexShmkey(); key_t chooseEMIndexShmkey();
key_t getInitialEMIndexShmkey() const; key_t getInitialEMIndexShmkey() const;
// see the code for how keys are segmented // see the code for how keys are segmented
key_t chooseShmkey(const MSTEntry* masterTableEntry, const uint32_t keyRangeBase) const; key_t chooseShmkey(const MSTEntry* masterTableEntry, const uint32_t keyRangeBase) const;
// Grab table.
void grabEMEntryTable(OPS op); void grabEMEntryTable(OPS op);
void grabFreeList(OPS op); void grabFreeList(OPS op);
void grabEMIndex(OPS op); void grabEMIndex(OPS op);
// Release table.
void releaseEMEntryTable(OPS op); void releaseEMEntryTable(OPS op);
void releaseFreeList(OPS op); void releaseFreeList(OPS op);
void releaseEMIndex(OPS op); void releaseEMIndex(OPS op);
// Grow memory.
void growEMShmseg(size_t nrows = 0); void growEMShmseg(size_t nrows = 0);
void growFLShmseg(); void growFLShmseg();
void growEMIndexShmseg(const size_t suggestedSize = 0); void growEMIndexShmseg(const size_t suggestedSize = 0);
void growIfNeededOnExtentCreate();
// Finish.
void finishChanges(); void finishChanges();
EXPORT unsigned getFilesPerColumnPartition(); EXPORT unsigned getFilesPerColumnPartition();
@ -1134,22 +1170,26 @@ class ExtentMap : public Undoable
void checkReloadConfig(); void checkReloadConfig();
ShmKeys fShmKeys; ShmKeys fShmKeys;
void makeUndoRecordRBTree(UndoRecordType type, const EMEntry& emEntry);
void undoChangesRBTree();
void confirmChangesRBTree();
bool fDebug; bool fDebug;
int _markInvalid(const LBID_t lbid, const execplan::CalpontSystemCatalog::ColDataType colDataType); int _markInvalid(const LBID_t lbid, const execplan::CalpontSystemCatalog::ColDataType colDataType);
template <class T> template <typename T>
void load(T* in); void load(T* in);
/** @brief Loads the extent map from a file into memory.
* template <typename T>
* @param in (in) the file to load the extent map from.
* @param upgradeV4ToV5 (in) flag indicating whether we are upgrading
* extent map from v4 to v5.
*/
template <class T>
void loadVersion4or5(T* in, bool upgradeV4ToV5); void loadVersion4or5(T* in, bool upgradeV4ToV5);
ExtentMapImpl* fPExtMapImpl; ExtentMapRBTree::iterator findByLBID(const LBID_t lbid);
using UndoRecordPair = std::pair<UndoRecordType, EMEntry>;
std::vector<UndoRecordPair> undoRecordsRBTree;
ExtentMapRBTreeImpl* fPExtMapRBTreeImpl;
FreeListImpl* fPFreeListImpl; FreeListImpl* fPFreeListImpl;
ExtentMapIndexImpl* fPExtMapIndexImpl_; ExtentMapIndexImpl* fPExtMapIndexImpl_;
}; };