📄 dbtux.hpp
字号:
// indexes and fragments /* * Ordered index. Top level data structure. The primary table (table * being indexed) lives in TUP. */ struct Index; friend struct Index; struct Index { enum State { NotDefined = 0, Defining = 1, Online = 2, // triggers activated and build done Dropping = 9 }; State m_state; DictTabInfo::TableType m_tableType; Uint32 m_tableId; Uint16 unused; Uint16 m_numFrags; Uint32 m_fragId[MaxIndexFragments]; Uint32 m_fragPtrI[MaxIndexFragments]; Uint32 m_descPage; // descriptor page Uint16 m_descOff; // offset within the page Uint16 m_numAttrs; bool m_storeNullKey; union { Uint32 nextPool; }; Index(); }; typedef Ptr<Index> IndexPtr; ArrayPool<Index> c_indexPool; /* * Fragment of an index, as known to DIH/TC. Represents the two * duplicate fragments known to LQH/ACC/TUP. Includes tree header. * There are no maintenance operation records yet. */ struct Frag; friend struct Frag; struct Frag { Uint32 m_tableId; // copy from index level Uint32 m_indexId; Uint16 unused; Uint16 m_fragId; Uint32 m_descPage; // copy from index level Uint16 m_descOff; Uint16 m_numAttrs; bool m_storeNullKey; TreeHead m_tree; TupLoc m_freeLoc; // list of free index nodes DLList<ScanOp> m_scanList; // current scans on this fragment Uint32 m_tupIndexFragPtrI; Uint32 m_tupTableFragPtrI[2]; Uint32 m_accTableFragPtrI[2]; union { Uint32 nextPool; }; Frag(ArrayPool<ScanOp>& scanOpPool); }; typedef Ptr<Frag> FragPtr; ArrayPool<Frag> c_fragPool; /* * Fragment metadata operation. */ struct FragOp { Uint32 m_userPtr; Uint32 m_userRef; Uint32 m_indexId; Uint32 m_fragId; Uint32 m_fragPtrI; Uint32 m_fragNo; // fragment number starting at zero Uint32 m_numAttrsRecvd; union { Uint32 nextPool; }; FragOp(); }; typedef Ptr<FragOp> FragOpPtr; ArrayPool<FragOp> c_fragOpPool; // node handles /* * A node handle is a reference to a tree node in TUP. It is used to * operate on the node. Node handles are allocated on the stack. */ struct NodeHandle; friend struct NodeHandle; struct NodeHandle { Frag& m_frag; // fragment using the node TupLoc m_loc; // physical node address TreeNode* m_node; // pointer to node storage NodeHandle(Frag& frag); NodeHandle(const NodeHandle& node); NodeHandle& operator=(const NodeHandle& node); // check if unassigned bool isNull(); // getters TupLoc getLink(unsigned i); unsigned getChilds(); // cannot spell unsigned getSide(); unsigned getOccup(); int getBalance(); Uint32 getNodeScan(); // setters void setLink(unsigned i, TupLoc loc); void setSide(unsigned i); void setOccup(unsigned n); void setBalance(int b); void setNodeScan(Uint32 scanPtrI); // access other parts of the node Data getPref(); TreeEnt getEnt(unsigned pos); TreeEnt getMinMax(unsigned i); // for ndbrequire and ndbassert void progError(int line, int cause, const char* file); }; // methods /* * DbtuxGen.cpp */ void execCONTINUEB(Signal* signal); void execSTTOR(Signal* signal); void execREAD_CONFIG_REQ(Signal* signal); // utils void setKeyAttrs(const Frag& frag); void readKeyAttrs(const Frag& frag, TreeEnt ent, unsigned start, Data keyData); void readTablePk(const Frag& frag, TreeEnt ent, Data pkData, unsigned& pkSize); void copyAttrs(const Frag& frag, ConstData data1, Data data2, unsigned maxlen2 = MaxAttrDataSize); /* * DbtuxMeta.cpp */ void execTUXFRAGREQ(Signal* signal); void execTUX_ADD_ATTRREQ(Signal* signal); void execALTER_INDX_REQ(Signal* signal); void execDROP_TAB_REQ(Signal* signal); bool allocDescEnt(IndexPtr indexPtr); void freeDescEnt(IndexPtr indexPtr); void abortAddFragOp(Signal* signal); void dropIndex(Signal* signal, IndexPtr indexPtr, Uint32 senderRef, Uint32 senderData); /* * DbtuxMaint.cpp */ void execTUX_MAINT_REQ(Signal* signal); /* * DbtuxNode.cpp */ int allocNode(Signal* signal, NodeHandle& node); void selectNode(NodeHandle& node, TupLoc loc); void insertNode(NodeHandle& node); void deleteNode(NodeHandle& node); void setNodePref(NodeHandle& node); // node operations void nodePushUp(NodeHandle& node, unsigned pos, const TreeEnt& ent, Uint32 scanList); void nodePushUpScans(NodeHandle& node, unsigned pos); void nodePopDown(NodeHandle& node, unsigned pos, TreeEnt& en, Uint32* scanList); void nodePopDownScans(NodeHandle& node, unsigned pos); void nodePushDown(NodeHandle& node, unsigned pos, TreeEnt& ent, Uint32& scanList); void nodePushDownScans(NodeHandle& node, unsigned pos); void nodePopUp(NodeHandle& node, unsigned pos, TreeEnt& ent, Uint32 scanList); void nodePopUpScans(NodeHandle& node, unsigned pos); void nodeSlide(NodeHandle& dstNode, NodeHandle& srcNode, unsigned cnt, unsigned i); // scans linked to node void addScanList(NodeHandle& node, unsigned pos, Uint32 scanList); void removeScanList(NodeHandle& node, unsigned pos, Uint32& scanList); void moveScanList(NodeHandle& node, unsigned pos); void linkScan(NodeHandle& node, ScanOpPtr scanPtr); void unlinkScan(NodeHandle& node, ScanOpPtr scanPtr); bool islinkScan(NodeHandle& node, ScanOpPtr scanPtr); /* * DbtuxTree.cpp */ // add entry void treeAdd(Frag& frag, TreePos treePos, TreeEnt ent); void treeAddFull(Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent); void treeAddNode(Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent, NodeHandle parentNode, unsigned i); void treeAddRebalance(Frag& frag, NodeHandle node, unsigned i); // remove entry void treeRemove(Frag& frag, TreePos treePos); void treeRemoveInner(Frag& frag, NodeHandle lubNode, unsigned pos); void treeRemoveSemi(Frag& frag, NodeHandle node, unsigned i); void treeRemoveLeaf(Frag& frag, NodeHandle node); void treeRemoveNode(Frag& frag, NodeHandle node); void treeRemoveRebalance(Frag& frag, NodeHandle node, unsigned i); // rotate void treeRotateSingle(Frag& frag, NodeHandle& node, unsigned i); void treeRotateDouble(Frag& frag, NodeHandle& node, unsigned i); /* * DbtuxScan.cpp */ void execACC_SCANREQ(Signal* signal); void execTUX_BOUND_INFO(Signal* signal); void execNEXT_SCANREQ(Signal* signal); void execACC_CHECK_SCAN(Signal* signal); void execACCKEYCONF(Signal* signal); void execACCKEYREF(Signal* signal); void execACC_ABORTCONF(Signal* signal); void scanFirst(ScanOpPtr scanPtr); void scanNext(ScanOpPtr scanPtr, bool fromMaintReq); bool scanVisible(ScanOpPtr scanPtr, TreeEnt ent); void scanClose(Signal* signal, ScanOpPtr scanPtr); void addAccLockOp(ScanOp& scan, Uint32 accLockOp); void removeAccLockOp(ScanOp& scan, Uint32 accLockOp); void releaseScanOp(ScanOpPtr& scanPtr); /* * DbtuxSearch.cpp */ void searchToAdd(Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToRemove(Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToScan(Frag& frag, ConstData boundInfo, unsigned boundCount, bool descending, TreePos& treePos); void searchToScanAscending(Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos); void searchToScanDescending(Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos); /* * DbtuxCmp.cpp */ int cmpSearchKey(const Frag& frag, unsigned& start, ConstData searchKey, ConstData entryData, unsigned maxlen = MaxAttrDataSize); int cmpScanBound(const Frag& frag, unsigned dir, ConstData boundInfo, unsigned boundCount, ConstData entryData, unsigned maxlen = MaxAttrDataSize); /* * DbtuxDebug.cpp */ void execDUMP_STATE_ORD(Signal* signal);#ifdef VM_TRACE struct PrintPar { char m_path[100]; // LR prefix unsigned m_side; // expected side TupLoc m_parent; // expected parent address int m_depth; // returned depth unsigned m_occup; // returned occupancy TreeEnt m_minmax[2]; // returned subtree min and max bool m_ok; // returned status PrintPar(); }; void printTree(Signal* signal, Frag& frag, NdbOut& out); void printNode(Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par); friend class NdbOut& operator<<(NdbOut&, const TupLoc&); friend class NdbOut& operator<<(NdbOut&, const TreeEnt&); friend class NdbOut& operator<<(NdbOut&, const TreeNode&); friend class NdbOut& operator<<(NdbOut&, const TreeHead&); friend class NdbOut& operator<<(NdbOut&, const TreePos&); friend class NdbOut& operator<<(NdbOut&, const DescAttr&); friend class NdbOut& operator<<(NdbOut&, const ScanOp&); friend class NdbOut& operator<<(NdbOut&, const Index&); friend class NdbOut& operator<<(NdbOut&, const Frag&); friend class NdbOut& operator<<(NdbOut&, const FragOp&); friend class NdbOut& operator<<(NdbOut&, const NodeHandle&); FILE* debugFile; NdbOut debugOut; unsigned debugFlags; enum { DebugMeta = 1, // log create and drop index DebugMaint = 2, // log maintenance ops DebugTree = 4, // log and check tree after each op DebugScan = 8 // log scans }; STATIC_CONST( DataFillByte = 0xa2 ); STATIC_CONST( NodeFillByte = 0xa4 );#endif // start up info Uint32 c_internalStartPhase; Uint32 c_typeOfStart; /* * Global data set at operation start. Unpacked from index metadata. * Not passed as parameter to methods. Invalid across timeslices. * * TODO inline all into index metadata */ // index key attr ids with sizes in AttributeHeader format Data c_keyAttrs; // pointers to index key comparison functions NdbSqlUtil::Cmp** c_sqlCmp; /* * Other buffers used during the operation. */ // buffer for search key data with headers Data c_searchKey; // buffer for current entry key data with headers Data c_entryKey; // buffer for scan bounds and keyinfo (primary key) Data c_dataBuffer; // inlined utils DescEnt& getDescEnt(Uint32 descPage, Uint32 descOff); Uint32 getTupAddr(const Frag& frag, TreeEnt ent); static unsigned min(unsigned x, unsigned y); static unsigned max(unsigned x, unsigned y);};// Dbtux::DatainlineDbtux::Data::Data() : m_data(0){}inlineDbtux::Data::Data(Uint32* data) : m_data(data){}inline Dbtux::Data&Dbtux::Data::operator=(Uint32* data){ m_data = data; return *this;}inlineDbtux::Data::operator Uint32*() const{ return m_data;}inline Dbtux::Data&Dbtux::Data::operator+=(size_t n){ m_data += n; return *this;}inline AttributeHeader&Dbtux::Data::ah() const{ return *reinterpret_cast<AttributeHeader*>(m_data);}// Dbtux::ConstDatainlineDbtux::ConstData::ConstData() : m_data(0){}inlineDbtux::ConstData::ConstData(const Uint32* data) : m_data(data){}inline Dbtux::ConstData&Dbtux::ConstData::operator=(const Uint32* data){ m_data = data; return *this;}inlineDbtux::ConstData::operator const Uint32*() const{ return m_data;}inline Dbtux::ConstData&Dbtux::ConstData::operator+=(size_t n){ m_data += n; return *this;}inline const AttributeHeader&Dbtux::ConstData::ah() const{ return *reinterpret_cast<const AttributeHeader*>(m_data);}inlineDbtux::ConstData::ConstData(Data data) : m_data(static_cast<Uint32*>(data)){}inline Dbtux::ConstData&Dbtux::ConstData::operator=(Data data){ m_data = static_cast<Uint32*>(data); return *this;}// Dbtux::TupLocinlineDbtux::TupLoc::TupLoc() : m_pageId1(RNIL >> 16), m_pageId2(RNIL & 0xFFFF), m_pageOffset(0){}inlineDbtux::TupLoc::TupLoc(Uint32 pageId, Uint16 pageOffset) : m_pageId1(pageId >> 16), m_pageId2(pageId & 0xFFFF), m_pageOffset(pageOffset){}inline Uint32Dbtux::TupLoc::getPageId() const{ return (m_pageId1 << 16) | m_pageId2;}inline voidDbtux::TupLoc::setPageId(Uint32 pageId){ m_pageId1 = (pageId >> 16); m_pageId2 = (pageId & 0xFFFF);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -