Loading ndb/include/kernel/ndb_limits.h +1 −1 Original line number Diff line number Diff line Loading @@ -110,7 +110,7 @@ */ #define MAX_TTREE_NODE_SIZE 64 // total words in node #define MAX_TTREE_PREF_SIZE 4 // words in min prefix #define MAX_TTREE_NODE_SLACK 3 // diff between max and min occupancy #define MAX_TTREE_NODE_SLACK 2 // diff between max and min occupancy /* * Blobs. Loading ndb/src/kernel/blocks/dbtux/Dbtux.hpp +39 −22 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ // signal classes #include <signaldata/DictTabInfo.hpp> #include <signaldata/TuxContinueB.hpp> #include <signaldata/BuildIndx.hpp> #include <signaldata/TupFrag.hpp> #include <signaldata/AlterIndx.hpp> #include <signaldata/DropTab.hpp> Loading Loading @@ -478,7 +477,7 @@ private: Uint16 m_numAttrs; bool m_storeNullKey; TreeHead m_tree; TupLoc m_freeLoc; // one node pre-allocated for insert TupLoc m_freeLoc; // list of free index nodes DLList<ScanOp> m_scanList; // current scans on this fragment Uint32 m_tupIndexFragPtrI; Uint32 m_tupTableFragPtrI[2]; Loading Loading @@ -582,17 +581,24 @@ private: * DbtuxNode.cpp */ int allocNode(Signal* signal, NodeHandle& node); void selectNode(Signal* signal, NodeHandle& node, TupLoc loc); void insertNode(Signal* signal, NodeHandle& node); void deleteNode(Signal* signal, NodeHandle& node); void setNodePref(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(Signal* signal, NodeHandle& node, unsigned pos, const TreeEnt& ent); void nodePopDown(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodePushDown(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodePopUp(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodeSlide(Signal* signal, NodeHandle& dstNode, NodeHandle& srcNode, unsigned i); 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); Loading @@ -600,10 +606,21 @@ private: /* * DbtuxTree.cpp */ void treeAdd(Signal* signal, Frag& frag, TreePos treePos, TreeEnt ent); void treeRemove(Signal* signal, Frag& frag, TreePos treePos); void treeRotateSingle(Signal* signal, Frag& frag, NodeHandle& node, unsigned i); void treeRotateDouble(Signal* signal, Frag& frag, NodeHandle& node, unsigned i); // 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 Loading @@ -615,9 +632,9 @@ private: void execACCKEYCONF(Signal* signal); void execACCKEYREF(Signal* signal); void execACC_ABORTCONF(Signal* signal); void scanFirst(Signal* signal, ScanOpPtr scanPtr); void scanNext(Signal* signal, ScanOpPtr scanPtr); bool scanVisible(Signal* signal, ScanOpPtr scanPtr, TreeEnt ent); void scanFirst(ScanOpPtr scanPtr); void scanNext(ScanOpPtr scanPtr); bool scanVisible(ScanOpPtr scanPtr, TreeEnt ent); void scanClose(Signal* signal, ScanOpPtr scanPtr); void addAccLockOp(ScanOp& scan, Uint32 accLockOp); void removeAccLockOp(ScanOp& scan, Uint32 accLockOp); Loading @@ -626,9 +643,9 @@ private: /* * DbtuxSearch.cpp */ void searchToAdd(Signal* signal, Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToRemove(Signal* signal, Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToScan(Signal* signal, Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos); 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, TreePos& treePos); /* * DbtuxCmp.cpp Loading @@ -652,7 +669,7 @@ private: PrintPar(); }; void printTree(Signal* signal, Frag& frag, NdbOut& out); void printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par); 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&); Loading ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) strcpy(par.m_path, "."); par.m_side = 2; par.m_parent = NullTupLoc; printNode(signal, frag, out, tree.m_root, par); printNode(frag, out, tree.m_root, par); out.m_out->flush(); if (! par.m_ok) { if (debugFile == 0) { Loading @@ -114,7 +114,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) } void Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) Dbtux::printNode(Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) { if (loc == NullTupLoc) { par.m_depth = 0; Loading @@ -122,7 +122,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& } TreeHead& tree = frag.m_tree; NodeHandle node(frag); selectNode(signal, node, loc); selectNode(node, loc); out << par.m_path << " " << node << endl; // check children PrintPar cpar[2]; Loading @@ -132,7 +132,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& cpar[i].m_side = i; cpar[i].m_depth = 0; cpar[i].m_parent = loc; printNode(signal, frag, out, node.getLink(i), cpar[i]); printNode(frag, out, node.getLink(i), cpar[i]); if (! cpar[i].m_ok) { par.m_ok = false; } Loading Loading @@ -178,16 +178,19 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& out << "occupancy " << node.getOccup() << " of interior node"; out << " less than min " << tree.m_minOccup << endl; } // check missed half-leaf/leaf merge #ifdef dbtux_totally_groks_t_trees // check missed semi-leaf/leaf merge for (unsigned i = 0; i <= 1; i++) { if (node.getLink(i) != NullTupLoc && node.getLink(1 - i) == NullTupLoc && node.getOccup() + cpar[i].m_occup <= tree.m_maxOccup) { // our semi-leaf seems to satify interior minOccup condition node.getOccup() < tree.m_minOccup) { par.m_ok = false; out << par.m_path << sep; out << "missed merge with child " << i << endl; } } #endif // check inline prefix { ConstData data1 = node.getPref(); Uint32 data2[MaxPrefSize]; Loading ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp +8 −6 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) switch (opCode) { case TuxMaintReq::OpAdd: jam(); searchToAdd(signal, frag, c_searchKey, ent, treePos); searchToAdd(frag, c_searchKey, ent, treePos); #ifdef VM_TRACE if (debugFlags & DebugMaint) { debugOut << treePos << (treePos.m_match ? " - error" : "") << endl; Loading @@ -133,8 +133,8 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) break; } /* * At most one new node is inserted in the operation. We keep one * free node pre-allocated so the operation cannot fail. * At most one new node is inserted in the operation. Pre-allocate * it so that the operation cannot fail. */ if (frag.m_freeLoc == NullTupLoc) { jam(); Loading @@ -144,14 +144,16 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) jam(); break; } // link to freelist node.setLink(0, frag.m_freeLoc); frag.m_freeLoc = node.m_loc; ndbrequire(frag.m_freeLoc != NullTupLoc); } treeAdd(signal, frag, treePos, ent); treeAdd(frag, treePos, ent); break; case TuxMaintReq::OpRemove: jam(); searchToRemove(signal, frag, c_searchKey, ent, treePos); searchToRemove(frag, c_searchKey, ent, treePos); #ifdef VM_TRACE if (debugFlags & DebugMaint) { debugOut << treePos << (! treePos.m_match ? " - error" : "") << endl; Loading @@ -166,7 +168,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) } break; } treeRemove(signal, frag, treePos); treeRemove(frag, treePos); break; default: ndbrequire(false); Loading ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp +0 −4 Original line number Diff line number Diff line Loading @@ -211,11 +211,7 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) // make these configurable later tree.m_nodeSize = MAX_TTREE_NODE_SIZE; tree.m_prefSize = MAX_TTREE_PREF_SIZE; #ifdef dbtux_min_occup_less_max_occup const unsigned maxSlack = MAX_TTREE_NODE_SLACK; #else const unsigned maxSlack = 0; #endif // size up to and including first 2 entries const unsigned pref = tree.getSize(AccPref); if (! (pref <= tree.m_nodeSize)) { Loading Loading
ndb/include/kernel/ndb_limits.h +1 −1 Original line number Diff line number Diff line Loading @@ -110,7 +110,7 @@ */ #define MAX_TTREE_NODE_SIZE 64 // total words in node #define MAX_TTREE_PREF_SIZE 4 // words in min prefix #define MAX_TTREE_NODE_SLACK 3 // diff between max and min occupancy #define MAX_TTREE_NODE_SLACK 2 // diff between max and min occupancy /* * Blobs. Loading
ndb/src/kernel/blocks/dbtux/Dbtux.hpp +39 −22 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ // signal classes #include <signaldata/DictTabInfo.hpp> #include <signaldata/TuxContinueB.hpp> #include <signaldata/BuildIndx.hpp> #include <signaldata/TupFrag.hpp> #include <signaldata/AlterIndx.hpp> #include <signaldata/DropTab.hpp> Loading Loading @@ -478,7 +477,7 @@ private: Uint16 m_numAttrs; bool m_storeNullKey; TreeHead m_tree; TupLoc m_freeLoc; // one node pre-allocated for insert TupLoc m_freeLoc; // list of free index nodes DLList<ScanOp> m_scanList; // current scans on this fragment Uint32 m_tupIndexFragPtrI; Uint32 m_tupTableFragPtrI[2]; Loading Loading @@ -582,17 +581,24 @@ private: * DbtuxNode.cpp */ int allocNode(Signal* signal, NodeHandle& node); void selectNode(Signal* signal, NodeHandle& node, TupLoc loc); void insertNode(Signal* signal, NodeHandle& node); void deleteNode(Signal* signal, NodeHandle& node); void setNodePref(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(Signal* signal, NodeHandle& node, unsigned pos, const TreeEnt& ent); void nodePopDown(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodePushDown(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodePopUp(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent); void nodeSlide(Signal* signal, NodeHandle& dstNode, NodeHandle& srcNode, unsigned i); 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); Loading @@ -600,10 +606,21 @@ private: /* * DbtuxTree.cpp */ void treeAdd(Signal* signal, Frag& frag, TreePos treePos, TreeEnt ent); void treeRemove(Signal* signal, Frag& frag, TreePos treePos); void treeRotateSingle(Signal* signal, Frag& frag, NodeHandle& node, unsigned i); void treeRotateDouble(Signal* signal, Frag& frag, NodeHandle& node, unsigned i); // 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 Loading @@ -615,9 +632,9 @@ private: void execACCKEYCONF(Signal* signal); void execACCKEYREF(Signal* signal); void execACC_ABORTCONF(Signal* signal); void scanFirst(Signal* signal, ScanOpPtr scanPtr); void scanNext(Signal* signal, ScanOpPtr scanPtr); bool scanVisible(Signal* signal, ScanOpPtr scanPtr, TreeEnt ent); void scanFirst(ScanOpPtr scanPtr); void scanNext(ScanOpPtr scanPtr); bool scanVisible(ScanOpPtr scanPtr, TreeEnt ent); void scanClose(Signal* signal, ScanOpPtr scanPtr); void addAccLockOp(ScanOp& scan, Uint32 accLockOp); void removeAccLockOp(ScanOp& scan, Uint32 accLockOp); Loading @@ -626,9 +643,9 @@ private: /* * DbtuxSearch.cpp */ void searchToAdd(Signal* signal, Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToRemove(Signal* signal, Frag& frag, ConstData searchKey, TreeEnt searchEnt, TreePos& treePos); void searchToScan(Signal* signal, Frag& frag, ConstData boundInfo, unsigned boundCount, TreePos& treePos); 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, TreePos& treePos); /* * DbtuxCmp.cpp Loading @@ -652,7 +669,7 @@ private: PrintPar(); }; void printTree(Signal* signal, Frag& frag, NdbOut& out); void printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par); 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&); Loading
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) strcpy(par.m_path, "."); par.m_side = 2; par.m_parent = NullTupLoc; printNode(signal, frag, out, tree.m_root, par); printNode(frag, out, tree.m_root, par); out.m_out->flush(); if (! par.m_ok) { if (debugFile == 0) { Loading @@ -114,7 +114,7 @@ Dbtux::printTree(Signal* signal, Frag& frag, NdbOut& out) } void Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) Dbtux::printNode(Frag& frag, NdbOut& out, TupLoc loc, PrintPar& par) { if (loc == NullTupLoc) { par.m_depth = 0; Loading @@ -122,7 +122,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& } TreeHead& tree = frag.m_tree; NodeHandle node(frag); selectNode(signal, node, loc); selectNode(node, loc); out << par.m_path << " " << node << endl; // check children PrintPar cpar[2]; Loading @@ -132,7 +132,7 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& cpar[i].m_side = i; cpar[i].m_depth = 0; cpar[i].m_parent = loc; printNode(signal, frag, out, node.getLink(i), cpar[i]); printNode(frag, out, node.getLink(i), cpar[i]); if (! cpar[i].m_ok) { par.m_ok = false; } Loading Loading @@ -178,16 +178,19 @@ Dbtux::printNode(Signal* signal, Frag& frag, NdbOut& out, TupLoc loc, PrintPar& out << "occupancy " << node.getOccup() << " of interior node"; out << " less than min " << tree.m_minOccup << endl; } // check missed half-leaf/leaf merge #ifdef dbtux_totally_groks_t_trees // check missed semi-leaf/leaf merge for (unsigned i = 0; i <= 1; i++) { if (node.getLink(i) != NullTupLoc && node.getLink(1 - i) == NullTupLoc && node.getOccup() + cpar[i].m_occup <= tree.m_maxOccup) { // our semi-leaf seems to satify interior minOccup condition node.getOccup() < tree.m_minOccup) { par.m_ok = false; out << par.m_path << sep; out << "missed merge with child " << i << endl; } } #endif // check inline prefix { ConstData data1 = node.getPref(); Uint32 data2[MaxPrefSize]; Loading
ndb/src/kernel/blocks/dbtux/DbtuxMaint.cpp +8 −6 Original line number Diff line number Diff line Loading @@ -117,7 +117,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) switch (opCode) { case TuxMaintReq::OpAdd: jam(); searchToAdd(signal, frag, c_searchKey, ent, treePos); searchToAdd(frag, c_searchKey, ent, treePos); #ifdef VM_TRACE if (debugFlags & DebugMaint) { debugOut << treePos << (treePos.m_match ? " - error" : "") << endl; Loading @@ -133,8 +133,8 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) break; } /* * At most one new node is inserted in the operation. We keep one * free node pre-allocated so the operation cannot fail. * At most one new node is inserted in the operation. Pre-allocate * it so that the operation cannot fail. */ if (frag.m_freeLoc == NullTupLoc) { jam(); Loading @@ -144,14 +144,16 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) jam(); break; } // link to freelist node.setLink(0, frag.m_freeLoc); frag.m_freeLoc = node.m_loc; ndbrequire(frag.m_freeLoc != NullTupLoc); } treeAdd(signal, frag, treePos, ent); treeAdd(frag, treePos, ent); break; case TuxMaintReq::OpRemove: jam(); searchToRemove(signal, frag, c_searchKey, ent, treePos); searchToRemove(frag, c_searchKey, ent, treePos); #ifdef VM_TRACE if (debugFlags & DebugMaint) { debugOut << treePos << (! treePos.m_match ? " - error" : "") << endl; Loading @@ -166,7 +168,7 @@ Dbtux::execTUX_MAINT_REQ(Signal* signal) } break; } treeRemove(signal, frag, treePos); treeRemove(frag, treePos); break; default: ndbrequire(false); Loading
ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp +0 −4 Original line number Diff line number Diff line Loading @@ -211,11 +211,7 @@ Dbtux::execTUX_ADD_ATTRREQ(Signal* signal) // make these configurable later tree.m_nodeSize = MAX_TTREE_NODE_SIZE; tree.m_prefSize = MAX_TTREE_PREF_SIZE; #ifdef dbtux_min_occup_less_max_occup const unsigned maxSlack = MAX_TTREE_NODE_SLACK; #else const unsigned maxSlack = 0; #endif // size up to and including first 2 entries const unsigned pref = tree.getSize(AccPref); if (! (pref <= tree.m_nodeSize)) { Loading