Loading ndb/include/kernel/signaldata/TupAccess.hpp +4 −2 Original line number Diff line number Diff line Loading @@ -129,6 +129,8 @@ private: /* * Operate on entire tuple. Used by TUX where the table has a single * Uint32 array attribute representing an index tree node. * * XXX this signal will be replaced by method in TUP */ class TupStoreTh { friend class Dbtup; Loading @@ -153,8 +155,8 @@ private: Uint32 tableId; Uint32 fragId; Uint32 fragPtrI; Uint32 tupAddr; Uint32 tupVersion; Uint32 tupAddr; // no longer used Uint32 tupVersion; // no longer used Uint32 pageId; Uint32 pageOffset; Uint32 bufferId; Loading ndb/src/kernel/blocks/dbtux/Dbtux.hpp +222 −176 Original line number Diff line number Diff line Loading @@ -153,8 +153,7 @@ private: static const unsigned AttributeHeaderSize = 1; /* * Logical tuple address, "local key". Identifies both table tuples * and index tuples. The code assumes it is one word. * Logical tuple address, "local key". Identifies table tuples. */ typedef Uint32 TupAddr; static const unsigned NullTupAddr = (Uint32)-1; Loading @@ -168,8 +167,18 @@ private: Uint32 m_pageId; // page i-value Uint16 m_pageOffset; // page offset in words TupLoc(); TupLoc(Uint32 pageId, Uint16 pageOffset); bool operator==(const TupLoc& loc) const; bool operator!=(const TupLoc& loc) const; }; /* * There is no const variable NullTupLoc since the compiler may not be * able to optimize it to TupLoc() constants. Instead null values are * constructed on the stack with TupLoc(). */ #define NullTupLoc TupLoc() // tree definitions /* Loading @@ -183,7 +192,7 @@ private: TupAddr m_tupAddr; // address of original tuple Uint16 m_tupVersion; // version Uint8 m_fragBit; // which duplicated table fragment Uint8 unused1; Uint8 pad1; TreeEnt(); // methods int cmp(const TreeEnt ent) const; Loading @@ -196,7 +205,7 @@ private: * prefix 3) max and min entries 4) rest of entries 5) one extra entry * used as work space. * * struct TreeNode part 1 * struct TreeNode part 1, size 6 words * min prefix part 2, size TreeHead::m_prefSize * max prefix part 2, size TreeHead::m_prefSize * max entry part 3 Loading @@ -204,6 +213,10 @@ private: * rest of entries part 4 * work entry part 5 * * There are 3 links to other nodes: left child, right child, parent. * These are in TupLoc format but the pageIds and pageOffsets are * stored in separate arrays (saves 1 word). * * Occupancy (number of entries) is at least 1 except temporarily when * a node is about to be removed. If occupancy is 1, only max entry * is present but both min and max prefixes are set. Loading @@ -211,11 +224,12 @@ private: struct TreeNode; friend struct TreeNode; struct TreeNode { TupAddr m_link[3]; // link to 0-left child 1-right child 2-parent Uint8 m_side; // we are 0-left child 1-right child 2-root Uint32 m_linkPI[3]; // link to 0-left child 1-right child 2-parent Uint16 m_linkPO[3]; // page offsets for above real page ids unsigned m_side : 2; // we are 0-left child 1-right child 2-root int m_balance : 2; // balance -1, 0, +1 unsigned pad1 : 4; Uint8 m_occup; // current number of entries Int8 m_balance; // balance -1, 0, +1 Uint8 unused1; Uint32 m_nodeScan; // list of scans at this node TreeNode(); }; Loading Loading @@ -243,7 +257,7 @@ private: Uint8 m_prefSize; // words in min/max prefix each Uint8 m_minOccup; // min entries in internal node Uint8 m_maxOccup; // max entries in node TupAddr m_root; // root node TupLoc m_root; // root node TreeHead(); // methods unsigned getSize(AccSize acc) const; Loading @@ -261,8 +275,7 @@ private: struct TreePos; friend struct TreePos; struct TreePos { TupAddr m_addr; // logical node address TupLoc m_loc; // physical address TupLoc m_loc; // physical node address Uint16 m_pos; // position 0 to m_occup Uint8 m_match; // at an existing entry Uint8 m_dir; // from link (0-2) or within node (3) Loading Loading @@ -494,7 +507,6 @@ private: }; Dbtux& m_tux; // this block Frag& m_frag; // fragment using the node TupAddr m_addr; // logical node address TupLoc m_loc; // physical node address AccSize m_acc; // accessed size unsigned m_flags; // flags Loading @@ -506,7 +518,7 @@ private: Uint32 m_cache[MaxTreeNodeSize]; NodeHandle(Dbtux& tux, Frag& frag); // getters TupAddr getLink(unsigned i); TupLoc getLink(unsigned i); unsigned getChilds(); // cannot spell unsigned getSide(); unsigned getOccup(); Loading @@ -516,7 +528,7 @@ private: TreeEnt getEnt(unsigned pos); TreeEnt getMinMax(unsigned i); // setters void setLink(unsigned i, TupAddr addr); void setLink(unsigned i, TupLoc loc); void setSide(unsigned i); void setOccup(unsigned n); void setBalance(int b); Loading Loading @@ -652,8 +664,8 @@ private: */ void seizeNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr); void preallocNode(Signal* signal, Frag& frag, Uint32& errorCode); void findNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupAddr addr); void selectNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupAddr addr, AccSize acc); void findNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupLoc loc); void selectNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupLoc loc, AccSize acc); void insertNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, AccSize acc); void deleteNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr); void accessNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, AccSize acc); Loading Loading @@ -701,23 +713,24 @@ private: struct PrintPar { char m_path[100]; // LR prefix unsigned m_side; // expected side TupAddr m_parent; // expected parent address TupLoc m_parent; // expected parent address int m_depth; // returned depth unsigned m_occup; // returned occupancy bool m_ok; // returned status PrintPar(); }; void printTree(Signal* signal, Frag& frag, NdbOut& out); void printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar& par); void printNode(Signal* signal, 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 NodeHandle&); friend class NdbOut& operator<<(NdbOut&, const ScanOp&); FILE* debugFile; NdbOut debugOut; unsigned debugFlags; Loading Loading @@ -834,8 +847,45 @@ Dbtux::ConstData::operator=(Data data) return *this; } // Dbtux::TupLoc inline Dbtux::TupLoc::TupLoc() : m_pageId(RNIL), m_pageOffset(0) { } inline Dbtux::TupLoc::TupLoc(Uint32 pageId, Uint16 pageOffset) : m_pageId(pageId), m_pageOffset(pageOffset) { } inline bool Dbtux::TupLoc::operator==(const TupLoc& loc) const { return m_pageId == loc.m_pageId && m_pageOffset == loc.m_pageOffset; } inline bool Dbtux::TupLoc::operator!=(const TupLoc& loc) const { return ! (*this == loc); } // Dbtux::TreeEnt inline Dbtux::TreeEnt::TreeEnt() : m_tupAddr(NullTupAddr), m_tupVersion(0), m_fragBit(255), pad1(0) { } inline int Dbtux::TreeEnt::cmp(const TreeEnt ent) const { Loading @@ -855,8 +905,36 @@ Dbtux::TreeEnt::cmp(const TreeEnt ent) const return 0; } // Dbtux::TreeNode inline Dbtux::TreeNode::TreeNode() : m_side(2), m_balance(0), pad1(0), m_occup(0), m_nodeScan(RNIL) { m_linkPI[0] = NullTupLoc.m_pageId; m_linkPO[0] = NullTupLoc.m_pageOffset; m_linkPI[1] = NullTupLoc.m_pageId; m_linkPO[1] = NullTupLoc.m_pageOffset; m_linkPI[2] = NullTupLoc.m_pageId; m_linkPO[2] = NullTupLoc.m_pageOffset; } // Dbtux::TreeHead inline Dbtux::TreeHead::TreeHead() : m_nodeSize(0), m_prefSize(0), m_minOccup(0), m_maxOccup(0), m_root() { } inline unsigned Dbtux::TreeHead::getSize(AccSize acc) const { Loading Loading @@ -888,52 +966,10 @@ Dbtux::TreeHead::getEntList(TreeNode* node) const return (TreeEnt*)ptr; } // Dbtux // constructors inline Dbtux::TupLoc::TupLoc() : m_pageId(RNIL), m_pageOffset(0) { } inline Dbtux::TreeEnt::TreeEnt() : m_tupAddr(NullTupAddr), m_tupVersion(0), m_fragBit(255), unused1(0) { } inline Dbtux::TreeNode::TreeNode() : m_side(255), m_occup(0), m_balance(0), unused1(0xa1), m_nodeScan(RNIL) { m_link[0] = NullTupAddr; m_link[1] = NullTupAddr; m_link[2] = NullTupAddr; } inline Dbtux::TreeHead::TreeHead() : m_nodeSize(0), m_prefSize(0), m_minOccup(0), m_maxOccup(0), m_root(0) { } // Dbtux::TreePos inline Dbtux::TreePos::TreePos() : m_addr(NullTupAddr), m_loc(), m_pos(ZNIL), m_match(false), Loading @@ -942,6 +978,8 @@ Dbtux::TreePos::TreePos() : { } // Dbtux::DescPage inline Dbtux::DescPage::DescPage() : m_nextPage(RNIL), Loading @@ -956,6 +994,41 @@ Dbtux::DescPage::DescPage() : } } // Dbtux::ScanOp inline Dbtux::ScanOp::ScanOp(ScanBoundPool& scanBoundPool) : m_state(Undef), m_lockwait(false), m_userPtr(RNIL), m_userRef(RNIL), m_tableId(RNIL), m_indexId(RNIL), m_fragPtrI(RNIL), m_transId1(0), m_transId2(0), m_savePointId(0), m_accLockOp(RNIL), m_readCommitted(0), m_lockMode(0), m_keyInfo(0), m_boundMin(scanBoundPool), m_boundMax(scanBoundPool), m_scanPos(), m_lastEnt(), m_nodeScan(RNIL) { m_bound[0] = &m_boundMin; m_bound[1] = &m_boundMax; m_boundCnt[0] = 0; m_boundCnt[1] = 0; for (unsigned i = 0; i < MaxAccLockOps; i++) { m_accLockOps[i] = RNIL; } } // Dbtux::Index inline Dbtux::Index::Index() : m_state(NotDefined), Loading @@ -972,6 +1045,8 @@ Dbtux::Index::Index() : }; }; // Dbtux::Frag inline Dbtux::Frag::Frag(ArrayPool<ScanOp>& scanOpPool) : m_tableId(RNIL), Loading @@ -993,6 +1068,8 @@ Dbtux::Frag::Frag(ArrayPool<ScanOp>& scanOpPool) : m_accTableFragPtrI[1] = RNIL; } // Dbtux::FragOp inline Dbtux::FragOp::FragOp() : m_userPtr(RNIL), Loading @@ -1005,11 +1082,12 @@ Dbtux::FragOp::FragOp() : { }; // Dbtux::NodeHandle inline Dbtux::NodeHandle::NodeHandle(Dbtux& tux, Frag& frag) : m_tux(tux), m_frag(frag), m_addr(NullTupAddr), m_loc(), m_acc(AccNone), m_flags(0), Loading @@ -1018,126 +1096,20 @@ Dbtux::NodeHandle::NodeHandle(Dbtux& tux, Frag& frag) : { } inline Dbtux::ScanOp::ScanOp(ScanBoundPool& scanBoundPool) : m_state(Undef), m_lockwait(false), m_userPtr(RNIL), m_userRef(RNIL), m_tableId(RNIL), m_indexId(RNIL), m_fragPtrI(RNIL), m_transId1(0), m_transId2(0), m_savePointId(0), m_accLockOp(RNIL), m_readCommitted(0), m_lockMode(0), m_keyInfo(0), m_boundMin(scanBoundPool), m_boundMax(scanBoundPool), m_scanPos(), m_lastEnt(), m_nodeScan(RNIL) { m_bound[0] = &m_boundMin; m_bound[1] = &m_boundMax; m_boundCnt[0] = 0; m_boundCnt[1] = 0; for (unsigned i = 0; i < MaxAccLockOps; i++) { m_accLockOps[i] = RNIL; } } inline Dbtux::CopyPar::CopyPar() : m_items(0), m_headers(true), m_maxwords(~0), // max unsigned // output m_numitems(0), m_numwords(0) { } inline Dbtux::ReadPar::ReadPar() : m_first(0), m_count(0), m_data(0), m_size(0) { } inline Dbtux::StorePar::StorePar() : m_opCode(TupStoreTh::OpUndefined), m_offset(0), m_size(0), m_errorCode(0) { } inline Dbtux::SearchPar::SearchPar() : m_data(0), m_ent() { } inline Dbtux::CmpPar::CmpPar() : m_data1(0), m_data2(0), m_len2(0), m_first(0), m_numEq(0) { } inline Dbtux::BoundPar::BoundPar() : m_data1(0), m_data2(0), m_count1(0), m_len2(0), m_dir(255) { } #ifdef VM_TRACE inline Dbtux::PrintPar::PrintPar() : // caller fills in m_path(), m_side(255), m_parent(NullTupAddr), // default return values m_depth(0), m_occup(0), m_ok(true) { } #endif // node handles inline Dbtux::TupAddr inline Dbtux::TupLoc Dbtux::NodeHandle::getLink(unsigned i) { ndbrequire(i <= 2); return m_node->m_link[i]; return TupLoc(m_node->m_linkPI[i], m_node->m_linkPO[i]); } inline unsigned Dbtux::NodeHandle::getChilds() { return (m_node->m_link[0] != NullTupAddr) + (m_node->m_link[1] != NullTupAddr); return (getLink(0) != NullTupLoc) + (getLink(1) != NullTupLoc); } inline Dbtux::TupAddr inline unsigned Dbtux::NodeHandle::getSide() { return m_node->m_side; Loading Loading @@ -1193,17 +1165,18 @@ Dbtux::NodeHandle::getMinMax(unsigned i) } inline void Dbtux::NodeHandle::setLink(unsigned i, TupAddr addr) Dbtux::NodeHandle::setLink(unsigned i, TupLoc loc) { ndbrequire(i <= 2); m_node->m_link[i] = addr; m_node->m_linkPI[i] = loc.m_pageId; m_node->m_linkPO[i] = loc.m_pageOffset; m_flags |= DoUpdate; } inline void Dbtux::NodeHandle::setSide(unsigned i) { // ndbrequire(i <= 1); ndbrequire(i <= 2); m_node->m_side = i; m_flags |= DoUpdate; } Loading Loading @@ -1232,6 +1205,79 @@ Dbtux::NodeHandle::setNodeScan(Uint32 scanPtrI) m_flags |= DoUpdate; } // parameters for methods inline Dbtux::CopyPar::CopyPar() : m_items(0), m_headers(true), m_maxwords(~0), // max unsigned // output m_numitems(0), m_numwords(0) { } inline Dbtux::ReadPar::ReadPar() : m_first(0), m_count(0), m_data(0), m_size(0) { } inline Dbtux::StorePar::StorePar() : m_opCode(TupStoreTh::OpUndefined), m_offset(0), m_size(0), m_errorCode(0) { } inline Dbtux::SearchPar::SearchPar() : m_data(0), m_ent() { } inline Dbtux::CmpPar::CmpPar() : m_data1(0), m_data2(0), m_len2(0), m_first(0), m_numEq(0) { } inline Dbtux::BoundPar::BoundPar() : m_data1(0), m_data2(0), m_count1(0), m_len2(0), m_dir(255) { } #ifdef VM_TRACE inline Dbtux::PrintPar::PrintPar() : // caller fills in m_path(), m_side(255), m_parent(), // default return values m_depth(0), m_occup(0), m_ok(true) { } #endif // other methods inline Dbtux::DescEnt& Loading ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp +28 −13 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) PrintPar par; strcpy(par.m_path, "."); par.m_side = 2; par.m_parent = NullTupAddr; par.m_parent = NullTupLoc; printNode(signal, frag, out, tree.m_root, par); out.m_out->flush(); if (! par.m_ok) { Loading @@ -116,15 +116,15 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) } void Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar& par) Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) { if (addr == NullTupAddr) { if (loc == NullTupLoc) { par.m_depth = 0; return; } TreeHead& tree = frag.m_tree; NodeHandlePtr nodePtr; selectNode(signal, frag, nodePtr, addr, AccFull); selectNode(signal, frag, nodePtr, loc, AccFull); out << par.m_path << " " << *nodePtr.p << endl; // check children PrintPar cpar[2]; Loading @@ -133,7 +133,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar sprintf(cpar[i].m_path, "%s%c", par.m_path, "LR"[i]); cpar[i].m_side = i; cpar[i].m_depth = 0; cpar[i].m_parent = addr; cpar[i].m_parent = loc; printNode(signal, frag, out, nodePtr.p->getLink(i), cpar[i]); if (! cpar[i].m_ok) { par.m_ok = false; Loading @@ -143,7 +143,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar if (nodePtr.p->getLink(2) != par.m_parent) { par.m_ok = false; out << par.m_path << " *** "; out << "parent addr " << hex << nodePtr.p->getLink(2); out << "parent loc " << hex << nodePtr.p->getLink(2); out << " should be " << hex << par.m_parent << endl; } if (nodePtr.p->getSide() != par.m_side) { Loading Loading @@ -181,8 +181,8 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar } // check missed half-leaf/leaf merge for (unsigned i = 0; i <= 1; i++) { if (nodePtr.p->getLink(i) != NullTupAddr && nodePtr.p->getLink(1 - i) == NullTupAddr && if (nodePtr.p->getLink(i) != NullTupLoc && nodePtr.p->getLink(1 - i) == NullTupLoc && nodePtr.p->getOccup() + cpar[i].m_occup <= tree.m_maxOccup) { par.m_ok = false; out << par.m_path << " *** "; Loading @@ -194,6 +194,18 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar par.m_occup = nodePtr.p->getOccup(); } NdbOut& operator<<(NdbOut& out, const Dbtux::TupLoc& loc) { if (loc == Dbtux::NullTupLoc) { out << "null"; } else { out << hex << loc.m_pageId; out << "." << dec << loc.m_pageOffset; } return out; } NdbOut& operator<<(NdbOut& out, const Dbtux::TreeEnt& ent) { Loading @@ -206,10 +218,13 @@ operator<<(NdbOut& out, const Dbtux::TreeEnt& ent) NdbOut& operator<<(NdbOut& out, const Dbtux::TreeNode& node) { Dbtux::TupLoc link0(node.m_linkPI[0], node.m_linkPO[0]); Dbtux::TupLoc link1(node.m_linkPI[1], node.m_linkPO[1]); Dbtux::TupLoc link2(node.m_linkPI[2], node.m_linkPO[2]); out << "[TreeNode " << hex << &node; out << " [left " << hex << node.m_link[0] << "]"; out << " [right " << hex << node.m_link[1] << "]"; out << " [up " << hex << node.m_link[2] << "]"; out << " [left " << link0 << "]"; out << " [right " << link1 << "]"; out << " [up " << link2 << "]"; out << " [side " << dec << node.m_side << "]"; out << " [occup " << dec << node.m_occup << "]"; out << " [balance " << dec << (int)node.m_balance << "]"; Loading Loading @@ -238,7 +253,7 @@ NdbOut& operator<<(NdbOut& out, const Dbtux::TreePos& pos) { out << "[TreePos " << hex << &pos; out << " [addr " << hex << pos.m_addr << "]"; out << " [loc " << pos.m_loc << "]"; out << " [pos " << dec << pos.m_pos << "]"; out << " [match " << dec << pos.m_match << "]"; out << " [dir " << dec << pos.m_dir << "]"; Loading Loading @@ -338,7 +353,7 @@ operator<<(NdbOut& out, const Dbtux::NodeHandle& node) const Dbtux::Frag& frag = node.m_frag; const Dbtux::TreeHead& tree = frag.m_tree; out << "[NodeHandle " << hex << &node; out << " [addr " << hex << node.m_addr << "]"; out << " [loc " << node.m_loc << "]"; out << " [acc " << dec << node.m_acc << "]"; out << " [flags " << hex << node.m_flags << "]"; out << " [node " << *node.m_node << "]"; Loading ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp +7 −10 Original line number Diff line number Diff line Loading @@ -285,8 +285,8 @@ Dbtux::tupStoreTh(Signal* signal, const Frag& frag, NodeHandlePtr nodePtr, Store req->tableId = frag.m_indexId; req->fragId = frag.m_fragId; req->fragPtrI = frag.m_tupIndexFragPtrI; req->tupAddr = nodePtr.p->m_addr; req->tupVersion = 0; req->tupAddr = RNIL; // no longer used req->tupVersion = 0; // no longer used req->pageId = nodePtr.p->m_loc.m_pageId; req->pageOffset = nodePtr.p->m_loc.m_pageOffset; req->bufferId = 0; Loading Loading @@ -346,21 +346,18 @@ Dbtux::tupStoreTh(Signal* signal, const Frag& frag, NodeHandlePtr nodePtr, Store const Uint32* src = (const Uint32*)buffer + storePar.m_offset; memcpy(dst, src, storePar.m_size << 2); } // fallthru break; case TupStoreTh::OpInsert: jam(); // fallthru case TupStoreTh::OpUpdate: jam(); nodePtr.p->m_addr = req->tupAddr; nodePtr.p->m_loc.m_pageId = req->pageId; nodePtr.p->m_loc.m_pageOffset = req->pageOffset; break; case TupStoreTh::OpUpdate: jam(); break; case TupStoreTh::OpDelete: jam(); nodePtr.p->m_addr = NullTupAddr; nodePtr.p->m_loc.m_pageId = RNIL; nodePtr.p->m_loc.m_pageOffset = 0; nodePtr.p->m_loc = NullTupLoc; break; default: ndbrequire(false); Loading ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) jam(); // initialize tree header TreeHead& tree = fragPtr.p->m_tree; new (&tree) TreeHead(); // make these configurable later tree.m_nodeSize = MAX_TTREE_NODE_SIZE; tree.m_prefSize = MAX_TTREE_PREF_SIZE; Loading @@ -227,8 +228,8 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) break; } tree.m_minOccup = tree.m_maxOccup - maxSlack; // root node does not exist tree.m_root = NullTupAddr; // root node does not exist (also set by ctor) tree.m_root = NullTupLoc; // fragment is defined c_fragOpPool.release(fragOpPtr); } Loading Loading
ndb/include/kernel/signaldata/TupAccess.hpp +4 −2 Original line number Diff line number Diff line Loading @@ -129,6 +129,8 @@ private: /* * Operate on entire tuple. Used by TUX where the table has a single * Uint32 array attribute representing an index tree node. * * XXX this signal will be replaced by method in TUP */ class TupStoreTh { friend class Dbtup; Loading @@ -153,8 +155,8 @@ private: Uint32 tableId; Uint32 fragId; Uint32 fragPtrI; Uint32 tupAddr; Uint32 tupVersion; Uint32 tupAddr; // no longer used Uint32 tupVersion; // no longer used Uint32 pageId; Uint32 pageOffset; Uint32 bufferId; Loading
ndb/src/kernel/blocks/dbtux/Dbtux.hpp +222 −176 Original line number Diff line number Diff line Loading @@ -153,8 +153,7 @@ private: static const unsigned AttributeHeaderSize = 1; /* * Logical tuple address, "local key". Identifies both table tuples * and index tuples. The code assumes it is one word. * Logical tuple address, "local key". Identifies table tuples. */ typedef Uint32 TupAddr; static const unsigned NullTupAddr = (Uint32)-1; Loading @@ -168,8 +167,18 @@ private: Uint32 m_pageId; // page i-value Uint16 m_pageOffset; // page offset in words TupLoc(); TupLoc(Uint32 pageId, Uint16 pageOffset); bool operator==(const TupLoc& loc) const; bool operator!=(const TupLoc& loc) const; }; /* * There is no const variable NullTupLoc since the compiler may not be * able to optimize it to TupLoc() constants. Instead null values are * constructed on the stack with TupLoc(). */ #define NullTupLoc TupLoc() // tree definitions /* Loading @@ -183,7 +192,7 @@ private: TupAddr m_tupAddr; // address of original tuple Uint16 m_tupVersion; // version Uint8 m_fragBit; // which duplicated table fragment Uint8 unused1; Uint8 pad1; TreeEnt(); // methods int cmp(const TreeEnt ent) const; Loading @@ -196,7 +205,7 @@ private: * prefix 3) max and min entries 4) rest of entries 5) one extra entry * used as work space. * * struct TreeNode part 1 * struct TreeNode part 1, size 6 words * min prefix part 2, size TreeHead::m_prefSize * max prefix part 2, size TreeHead::m_prefSize * max entry part 3 Loading @@ -204,6 +213,10 @@ private: * rest of entries part 4 * work entry part 5 * * There are 3 links to other nodes: left child, right child, parent. * These are in TupLoc format but the pageIds and pageOffsets are * stored in separate arrays (saves 1 word). * * Occupancy (number of entries) is at least 1 except temporarily when * a node is about to be removed. If occupancy is 1, only max entry * is present but both min and max prefixes are set. Loading @@ -211,11 +224,12 @@ private: struct TreeNode; friend struct TreeNode; struct TreeNode { TupAddr m_link[3]; // link to 0-left child 1-right child 2-parent Uint8 m_side; // we are 0-left child 1-right child 2-root Uint32 m_linkPI[3]; // link to 0-left child 1-right child 2-parent Uint16 m_linkPO[3]; // page offsets for above real page ids unsigned m_side : 2; // we are 0-left child 1-right child 2-root int m_balance : 2; // balance -1, 0, +1 unsigned pad1 : 4; Uint8 m_occup; // current number of entries Int8 m_balance; // balance -1, 0, +1 Uint8 unused1; Uint32 m_nodeScan; // list of scans at this node TreeNode(); }; Loading Loading @@ -243,7 +257,7 @@ private: Uint8 m_prefSize; // words in min/max prefix each Uint8 m_minOccup; // min entries in internal node Uint8 m_maxOccup; // max entries in node TupAddr m_root; // root node TupLoc m_root; // root node TreeHead(); // methods unsigned getSize(AccSize acc) const; Loading @@ -261,8 +275,7 @@ private: struct TreePos; friend struct TreePos; struct TreePos { TupAddr m_addr; // logical node address TupLoc m_loc; // physical address TupLoc m_loc; // physical node address Uint16 m_pos; // position 0 to m_occup Uint8 m_match; // at an existing entry Uint8 m_dir; // from link (0-2) or within node (3) Loading Loading @@ -494,7 +507,6 @@ private: }; Dbtux& m_tux; // this block Frag& m_frag; // fragment using the node TupAddr m_addr; // logical node address TupLoc m_loc; // physical node address AccSize m_acc; // accessed size unsigned m_flags; // flags Loading @@ -506,7 +518,7 @@ private: Uint32 m_cache[MaxTreeNodeSize]; NodeHandle(Dbtux& tux, Frag& frag); // getters TupAddr getLink(unsigned i); TupLoc getLink(unsigned i); unsigned getChilds(); // cannot spell unsigned getSide(); unsigned getOccup(); Loading @@ -516,7 +528,7 @@ private: TreeEnt getEnt(unsigned pos); TreeEnt getMinMax(unsigned i); // setters void setLink(unsigned i, TupAddr addr); void setLink(unsigned i, TupLoc loc); void setSide(unsigned i); void setOccup(unsigned n); void setBalance(int b); Loading Loading @@ -652,8 +664,8 @@ private: */ void seizeNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr); void preallocNode(Signal* signal, Frag& frag, Uint32& errorCode); void findNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupAddr addr); void selectNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupAddr addr, AccSize acc); void findNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupLoc loc); void selectNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, TupLoc loc, AccSize acc); void insertNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, AccSize acc); void deleteNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr); void accessNode(Signal* signal, Frag& frag, NodeHandlePtr& nodePtr, AccSize acc); Loading Loading @@ -701,23 +713,24 @@ private: struct PrintPar { char m_path[100]; // LR prefix unsigned m_side; // expected side TupAddr m_parent; // expected parent address TupLoc m_parent; // expected parent address int m_depth; // returned depth unsigned m_occup; // returned occupancy bool m_ok; // returned status PrintPar(); }; void printTree(Signal* signal, Frag& frag, NdbOut& out); void printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar& par); void printNode(Signal* signal, 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 NodeHandle&); friend class NdbOut& operator<<(NdbOut&, const ScanOp&); FILE* debugFile; NdbOut debugOut; unsigned debugFlags; Loading Loading @@ -834,8 +847,45 @@ Dbtux::ConstData::operator=(Data data) return *this; } // Dbtux::TupLoc inline Dbtux::TupLoc::TupLoc() : m_pageId(RNIL), m_pageOffset(0) { } inline Dbtux::TupLoc::TupLoc(Uint32 pageId, Uint16 pageOffset) : m_pageId(pageId), m_pageOffset(pageOffset) { } inline bool Dbtux::TupLoc::operator==(const TupLoc& loc) const { return m_pageId == loc.m_pageId && m_pageOffset == loc.m_pageOffset; } inline bool Dbtux::TupLoc::operator!=(const TupLoc& loc) const { return ! (*this == loc); } // Dbtux::TreeEnt inline Dbtux::TreeEnt::TreeEnt() : m_tupAddr(NullTupAddr), m_tupVersion(0), m_fragBit(255), pad1(0) { } inline int Dbtux::TreeEnt::cmp(const TreeEnt ent) const { Loading @@ -855,8 +905,36 @@ Dbtux::TreeEnt::cmp(const TreeEnt ent) const return 0; } // Dbtux::TreeNode inline Dbtux::TreeNode::TreeNode() : m_side(2), m_balance(0), pad1(0), m_occup(0), m_nodeScan(RNIL) { m_linkPI[0] = NullTupLoc.m_pageId; m_linkPO[0] = NullTupLoc.m_pageOffset; m_linkPI[1] = NullTupLoc.m_pageId; m_linkPO[1] = NullTupLoc.m_pageOffset; m_linkPI[2] = NullTupLoc.m_pageId; m_linkPO[2] = NullTupLoc.m_pageOffset; } // Dbtux::TreeHead inline Dbtux::TreeHead::TreeHead() : m_nodeSize(0), m_prefSize(0), m_minOccup(0), m_maxOccup(0), m_root() { } inline unsigned Dbtux::TreeHead::getSize(AccSize acc) const { Loading Loading @@ -888,52 +966,10 @@ Dbtux::TreeHead::getEntList(TreeNode* node) const return (TreeEnt*)ptr; } // Dbtux // constructors inline Dbtux::TupLoc::TupLoc() : m_pageId(RNIL), m_pageOffset(0) { } inline Dbtux::TreeEnt::TreeEnt() : m_tupAddr(NullTupAddr), m_tupVersion(0), m_fragBit(255), unused1(0) { } inline Dbtux::TreeNode::TreeNode() : m_side(255), m_occup(0), m_balance(0), unused1(0xa1), m_nodeScan(RNIL) { m_link[0] = NullTupAddr; m_link[1] = NullTupAddr; m_link[2] = NullTupAddr; } inline Dbtux::TreeHead::TreeHead() : m_nodeSize(0), m_prefSize(0), m_minOccup(0), m_maxOccup(0), m_root(0) { } // Dbtux::TreePos inline Dbtux::TreePos::TreePos() : m_addr(NullTupAddr), m_loc(), m_pos(ZNIL), m_match(false), Loading @@ -942,6 +978,8 @@ Dbtux::TreePos::TreePos() : { } // Dbtux::DescPage inline Dbtux::DescPage::DescPage() : m_nextPage(RNIL), Loading @@ -956,6 +994,41 @@ Dbtux::DescPage::DescPage() : } } // Dbtux::ScanOp inline Dbtux::ScanOp::ScanOp(ScanBoundPool& scanBoundPool) : m_state(Undef), m_lockwait(false), m_userPtr(RNIL), m_userRef(RNIL), m_tableId(RNIL), m_indexId(RNIL), m_fragPtrI(RNIL), m_transId1(0), m_transId2(0), m_savePointId(0), m_accLockOp(RNIL), m_readCommitted(0), m_lockMode(0), m_keyInfo(0), m_boundMin(scanBoundPool), m_boundMax(scanBoundPool), m_scanPos(), m_lastEnt(), m_nodeScan(RNIL) { m_bound[0] = &m_boundMin; m_bound[1] = &m_boundMax; m_boundCnt[0] = 0; m_boundCnt[1] = 0; for (unsigned i = 0; i < MaxAccLockOps; i++) { m_accLockOps[i] = RNIL; } } // Dbtux::Index inline Dbtux::Index::Index() : m_state(NotDefined), Loading @@ -972,6 +1045,8 @@ Dbtux::Index::Index() : }; }; // Dbtux::Frag inline Dbtux::Frag::Frag(ArrayPool<ScanOp>& scanOpPool) : m_tableId(RNIL), Loading @@ -993,6 +1068,8 @@ Dbtux::Frag::Frag(ArrayPool<ScanOp>& scanOpPool) : m_accTableFragPtrI[1] = RNIL; } // Dbtux::FragOp inline Dbtux::FragOp::FragOp() : m_userPtr(RNIL), Loading @@ -1005,11 +1082,12 @@ Dbtux::FragOp::FragOp() : { }; // Dbtux::NodeHandle inline Dbtux::NodeHandle::NodeHandle(Dbtux& tux, Frag& frag) : m_tux(tux), m_frag(frag), m_addr(NullTupAddr), m_loc(), m_acc(AccNone), m_flags(0), Loading @@ -1018,126 +1096,20 @@ Dbtux::NodeHandle::NodeHandle(Dbtux& tux, Frag& frag) : { } inline Dbtux::ScanOp::ScanOp(ScanBoundPool& scanBoundPool) : m_state(Undef), m_lockwait(false), m_userPtr(RNIL), m_userRef(RNIL), m_tableId(RNIL), m_indexId(RNIL), m_fragPtrI(RNIL), m_transId1(0), m_transId2(0), m_savePointId(0), m_accLockOp(RNIL), m_readCommitted(0), m_lockMode(0), m_keyInfo(0), m_boundMin(scanBoundPool), m_boundMax(scanBoundPool), m_scanPos(), m_lastEnt(), m_nodeScan(RNIL) { m_bound[0] = &m_boundMin; m_bound[1] = &m_boundMax; m_boundCnt[0] = 0; m_boundCnt[1] = 0; for (unsigned i = 0; i < MaxAccLockOps; i++) { m_accLockOps[i] = RNIL; } } inline Dbtux::CopyPar::CopyPar() : m_items(0), m_headers(true), m_maxwords(~0), // max unsigned // output m_numitems(0), m_numwords(0) { } inline Dbtux::ReadPar::ReadPar() : m_first(0), m_count(0), m_data(0), m_size(0) { } inline Dbtux::StorePar::StorePar() : m_opCode(TupStoreTh::OpUndefined), m_offset(0), m_size(0), m_errorCode(0) { } inline Dbtux::SearchPar::SearchPar() : m_data(0), m_ent() { } inline Dbtux::CmpPar::CmpPar() : m_data1(0), m_data2(0), m_len2(0), m_first(0), m_numEq(0) { } inline Dbtux::BoundPar::BoundPar() : m_data1(0), m_data2(0), m_count1(0), m_len2(0), m_dir(255) { } #ifdef VM_TRACE inline Dbtux::PrintPar::PrintPar() : // caller fills in m_path(), m_side(255), m_parent(NullTupAddr), // default return values m_depth(0), m_occup(0), m_ok(true) { } #endif // node handles inline Dbtux::TupAddr inline Dbtux::TupLoc Dbtux::NodeHandle::getLink(unsigned i) { ndbrequire(i <= 2); return m_node->m_link[i]; return TupLoc(m_node->m_linkPI[i], m_node->m_linkPO[i]); } inline unsigned Dbtux::NodeHandle::getChilds() { return (m_node->m_link[0] != NullTupAddr) + (m_node->m_link[1] != NullTupAddr); return (getLink(0) != NullTupLoc) + (getLink(1) != NullTupLoc); } inline Dbtux::TupAddr inline unsigned Dbtux::NodeHandle::getSide() { return m_node->m_side; Loading Loading @@ -1193,17 +1165,18 @@ Dbtux::NodeHandle::getMinMax(unsigned i) } inline void Dbtux::NodeHandle::setLink(unsigned i, TupAddr addr) Dbtux::NodeHandle::setLink(unsigned i, TupLoc loc) { ndbrequire(i <= 2); m_node->m_link[i] = addr; m_node->m_linkPI[i] = loc.m_pageId; m_node->m_linkPO[i] = loc.m_pageOffset; m_flags |= DoUpdate; } inline void Dbtux::NodeHandle::setSide(unsigned i) { // ndbrequire(i <= 1); ndbrequire(i <= 2); m_node->m_side = i; m_flags |= DoUpdate; } Loading Loading @@ -1232,6 +1205,79 @@ Dbtux::NodeHandle::setNodeScan(Uint32 scanPtrI) m_flags |= DoUpdate; } // parameters for methods inline Dbtux::CopyPar::CopyPar() : m_items(0), m_headers(true), m_maxwords(~0), // max unsigned // output m_numitems(0), m_numwords(0) { } inline Dbtux::ReadPar::ReadPar() : m_first(0), m_count(0), m_data(0), m_size(0) { } inline Dbtux::StorePar::StorePar() : m_opCode(TupStoreTh::OpUndefined), m_offset(0), m_size(0), m_errorCode(0) { } inline Dbtux::SearchPar::SearchPar() : m_data(0), m_ent() { } inline Dbtux::CmpPar::CmpPar() : m_data1(0), m_data2(0), m_len2(0), m_first(0), m_numEq(0) { } inline Dbtux::BoundPar::BoundPar() : m_data1(0), m_data2(0), m_count1(0), m_len2(0), m_dir(255) { } #ifdef VM_TRACE inline Dbtux::PrintPar::PrintPar() : // caller fills in m_path(), m_side(255), m_parent(), // default return values m_depth(0), m_occup(0), m_ok(true) { } #endif // other methods inline Dbtux::DescEnt& Loading
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp +28 −13 Original line number Diff line number Diff line Loading @@ -97,7 +97,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) PrintPar par; strcpy(par.m_path, "."); par.m_side = 2; par.m_parent = NullTupAddr; par.m_parent = NullTupLoc; printNode(signal, frag, out, tree.m_root, par); out.m_out->flush(); if (! par.m_ok) { Loading @@ -116,15 +116,15 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) } void Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar& par) Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) { if (addr == NullTupAddr) { if (loc == NullTupLoc) { par.m_depth = 0; return; } TreeHead& tree = frag.m_tree; NodeHandlePtr nodePtr; selectNode(signal, frag, nodePtr, addr, AccFull); selectNode(signal, frag, nodePtr, loc, AccFull); out << par.m_path << " " << *nodePtr.p << endl; // check children PrintPar cpar[2]; Loading @@ -133,7 +133,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar sprintf(cpar[i].m_path, "%s%c", par.m_path, "LR"[i]); cpar[i].m_side = i; cpar[i].m_depth = 0; cpar[i].m_parent = addr; cpar[i].m_parent = loc; printNode(signal, frag, out, nodePtr.p->getLink(i), cpar[i]); if (! cpar[i].m_ok) { par.m_ok = false; Loading @@ -143,7 +143,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar if (nodePtr.p->getLink(2) != par.m_parent) { par.m_ok = false; out << par.m_path << " *** "; out << "parent addr " << hex << nodePtr.p->getLink(2); out << "parent loc " << hex << nodePtr.p->getLink(2); out << " should be " << hex << par.m_parent << endl; } if (nodePtr.p->getSide() != par.m_side) { Loading Loading @@ -181,8 +181,8 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar } // check missed half-leaf/leaf merge for (unsigned i = 0; i <= 1; i++) { if (nodePtr.p->getLink(i) != NullTupAddr && nodePtr.p->getLink(1 - i) == NullTupAddr && if (nodePtr.p->getLink(i) != NullTupLoc && nodePtr.p->getLink(1 - i) == NullTupLoc && nodePtr.p->getOccup() + cpar[i].m_occup <= tree.m_maxOccup) { par.m_ok = false; out << par.m_path << " *** "; Loading @@ -194,6 +194,18 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupAddr addr, PrintPar par.m_occup = nodePtr.p->getOccup(); } NdbOut& operator<<(NdbOut& out, const Dbtux::TupLoc& loc) { if (loc == Dbtux::NullTupLoc) { out << "null"; } else { out << hex << loc.m_pageId; out << "." << dec << loc.m_pageOffset; } return out; } NdbOut& operator<<(NdbOut& out, const Dbtux::TreeEnt& ent) { Loading @@ -206,10 +218,13 @@ operator<<(NdbOut& out, const Dbtux::TreeEnt& ent) NdbOut& operator<<(NdbOut& out, const Dbtux::TreeNode& node) { Dbtux::TupLoc link0(node.m_linkPI[0], node.m_linkPO[0]); Dbtux::TupLoc link1(node.m_linkPI[1], node.m_linkPO[1]); Dbtux::TupLoc link2(node.m_linkPI[2], node.m_linkPO[2]); out << "[TreeNode " << hex << &node; out << " [left " << hex << node.m_link[0] << "]"; out << " [right " << hex << node.m_link[1] << "]"; out << " [up " << hex << node.m_link[2] << "]"; out << " [left " << link0 << "]"; out << " [right " << link1 << "]"; out << " [up " << link2 << "]"; out << " [side " << dec << node.m_side << "]"; out << " [occup " << dec << node.m_occup << "]"; out << " [balance " << dec << (int)node.m_balance << "]"; Loading Loading @@ -238,7 +253,7 @@ NdbOut& operator<<(NdbOut& out, const Dbtux::TreePos& pos) { out << "[TreePos " << hex << &pos; out << " [addr " << hex << pos.m_addr << "]"; out << " [loc " << pos.m_loc << "]"; out << " [pos " << dec << pos.m_pos << "]"; out << " [match " << dec << pos.m_match << "]"; out << " [dir " << dec << pos.m_dir << "]"; Loading Loading @@ -338,7 +353,7 @@ operator<<(NdbOut& out, const Dbtux::NodeHandle& node) const Dbtux::Frag& frag = node.m_frag; const Dbtux::TreeHead& tree = frag.m_tree; out << "[NodeHandle " << hex << &node; out << " [addr " << hex << node.m_addr << "]"; out << " [loc " << node.m_loc << "]"; out << " [acc " << dec << node.m_acc << "]"; out << " [flags " << hex << node.m_flags << "]"; out << " [node " << *node.m_node << "]"; Loading
ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp +7 −10 Original line number Diff line number Diff line Loading @@ -285,8 +285,8 @@ Dbtux::tupStoreTh(Signal* signal, const Frag& frag, NodeHandlePtr nodePtr, Store req->tableId = frag.m_indexId; req->fragId = frag.m_fragId; req->fragPtrI = frag.m_tupIndexFragPtrI; req->tupAddr = nodePtr.p->m_addr; req->tupVersion = 0; req->tupAddr = RNIL; // no longer used req->tupVersion = 0; // no longer used req->pageId = nodePtr.p->m_loc.m_pageId; req->pageOffset = nodePtr.p->m_loc.m_pageOffset; req->bufferId = 0; Loading Loading @@ -346,21 +346,18 @@ Dbtux::tupStoreTh(Signal* signal, const Frag& frag, NodeHandlePtr nodePtr, Store const Uint32* src = (const Uint32*)buffer + storePar.m_offset; memcpy(dst, src, storePar.m_size << 2); } // fallthru break; case TupStoreTh::OpInsert: jam(); // fallthru case TupStoreTh::OpUpdate: jam(); nodePtr.p->m_addr = req->tupAddr; nodePtr.p->m_loc.m_pageId = req->pageId; nodePtr.p->m_loc.m_pageOffset = req->pageOffset; break; case TupStoreTh::OpUpdate: jam(); break; case TupStoreTh::OpDelete: jam(); nodePtr.p->m_addr = NullTupAddr; nodePtr.p->m_loc.m_pageId = RNIL; nodePtr.p->m_loc.m_pageOffset = 0; nodePtr.p->m_loc = NullTupLoc; break; default: ndbrequire(false); Loading
ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) jam(); // initialize tree header TreeHead& tree = fragPtr.p->m_tree; new (&tree) TreeHead(); // make these configurable later tree.m_nodeSize = MAX_TTREE_NODE_SIZE; tree.m_prefSize = MAX_TTREE_PREF_SIZE; Loading @@ -227,8 +228,8 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) break; } tree.m_minOccup = tree.m_maxOccup - maxSlack; // root node does not exist tree.m_root = NullTupAddr; // root node does not exist (also set by ctor) tree.m_root = NullTupLoc; // fragment is defined c_fragOpPool.release(fragOpPtr); } Loading