Commit d49b8ac4 authored by unknown's avatar unknown
Browse files

NDB wl-1533 tux optim 17 - allow slack in interior nodes


ndb/include/kernel/ndb_limits.h:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/Dbtux.hpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/DbtuxDebug.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/DbtuxMeta.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/DbtuxSearch.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/DbtuxTree.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/src/kernel/blocks/dbtux/Times.txt:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
ndb/test/ndbapi/testOIBasic.cpp:
  tux optim 17 - rewrote treeAdd/treeRemove + allow slack in interior nodes
parent 0fbbaf9e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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.
+12 −1
Original line number Diff line number Diff line
@@ -591,7 +591,7 @@ private:
  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 nodeSlide(Signal* signal, NodeHandle& dstNode, NodeHandle& srcNode, unsigned cnt, unsigned i);
  // scans linked to node
  void linkScan(NodeHandle& node, ScanOpPtr scanPtr);
  void unlinkScan(NodeHandle& node, ScanOpPtr scanPtr);
@@ -600,8 +600,19 @@ private:
  /*
   * DbtuxTree.cpp
   */
  // add entry
  void treeAdd(Signal* signal, Frag& frag, TreePos treePos, TreeEnt ent);
  void treeAddFull(Signal* signal, Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent);
  void treeAddNode(Signal* signal, Frag& frag, NodeHandle lubNode, unsigned pos, TreeEnt ent, NodeHandle parentNode, unsigned i);
  void treeAddRebalance(Signal* signal, Frag& frag, NodeHandle node, unsigned i);
  // remove entry
  void treeRemove(Signal* signal, Frag& frag, TreePos treePos);
  void treeRemoveInner(Signal* signal, Frag& frag, NodeHandle lubNode, unsigned pos);
  void treeRemoveSemi(Signal* signal, Frag& frag, NodeHandle node, unsigned i);
  void treeRemoveLeaf(Signal* signal, Frag& frag, NodeHandle node);
  void treeRemoveNode(Signal* signal, Frag& frag, NodeHandle node);
  void treeRemoveRebalance(Signal* signal, Frag& frag, NodeHandle node, unsigned i);
  // rotate
  void treeRotateSingle(Signal* signal, Frag& frag, NodeHandle& node, unsigned i);
  void treeRotateDouble(Signal* signal, Frag& frag, NodeHandle& node, unsigned i);

+5 −2
Original line number Diff line number Diff line
@@ -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];
+0 −4
Original line number Diff line number Diff line
@@ -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)) {
+5 −4
Original line number Diff line number Diff line
@@ -386,19 +386,20 @@ Dbtux::nodePopUp(Signal* signal, NodeHandle& node, unsigned pos, TreeEnt& ent)
}

/*
 * Move all possible entries from another node before the min (i=0) or
 * after the max (i=1).  XXX can be optimized
 * Move number of entries from another node to this node before the min
 * (i=0) or after the max (i=1).  Expensive but not often used.
 */
void
Dbtux::nodeSlide(Signal* signal, NodeHandle& dstNode, NodeHandle& srcNode, unsigned i)
Dbtux::nodeSlide(Signal* signal, NodeHandle& dstNode, NodeHandle& srcNode, unsigned cnt, unsigned i)
{
  Frag& frag = dstNode.m_frag;
  TreeHead& tree = frag.m_tree;
  ndbrequire(i <= 1);
  while (dstNode.getOccup() < tree.m_maxOccup && srcNode.getOccup() != 0) {
  while (cnt != 0) {
    TreeEnt ent;
    nodePopDown(signal, srcNode, i == 0 ? srcNode.getOccup() - 1 : 0, ent);
    nodePushUp(signal, dstNode, i == 0 ? 0 : dstNode.getOccup(), ent);
    cnt--;
  }
}

Loading