ITS#8300 more for prev commit

Just tell explicitly which direction we moved/merged from
mdb.RE/0.9
Howard Chu 9 years ago
parent ba85adb52d
commit 94e8009ca4
  1. 16
      libraries/liblmdb/mdb.c

@ -1327,7 +1327,7 @@ static int mdb_node_add(MDB_cursor *mc, indx_t indx,
MDB_val *key, MDB_val *data, pgno_t pgno, unsigned int flags); MDB_val *key, MDB_val *data, pgno_t pgno, unsigned int flags);
static void mdb_node_del(MDB_cursor *mc, int ksize); static void mdb_node_del(MDB_cursor *mc, int ksize);
static void mdb_node_shrink(MDB_page *mp, indx_t indx); static void mdb_node_shrink(MDB_page *mp, indx_t indx);
static int mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst); static int mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft);
static int mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data); static int mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data);
static size_t mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data); static size_t mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data);
static size_t mdb_branch_size(MDB_env *env, MDB_val *key); static size_t mdb_branch_size(MDB_env *env, MDB_val *key);
@ -7526,7 +7526,7 @@ mdb_cursor_copy(const MDB_cursor *csrc, MDB_cursor *cdst);
/** Move a node from csrc to cdst. /** Move a node from csrc to cdst.
*/ */
static int static int
mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst) mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
{ {
MDB_node *srcnode; MDB_node *srcnode;
MDB_val key, data; MDB_val key, data;
@ -7628,7 +7628,7 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst)
mps = csrc->mc_pg[csrc->mc_top]; mps = csrc->mc_pg[csrc->mc_top];
/* If we're adding on the left, bump others up */ /* If we're adding on the left, bump others up */
if (!cdst->mc_ki[csrc->mc_top]) { if (fromleft) {
mpd = cdst->mc_pg[csrc->mc_top]; mpd = cdst->mc_pg[csrc->mc_top];
for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) { for (m2 = csrc->mc_txn->mt_cursors[dbi]; m2; m2=m2->mc_next) {
if (csrc->mc_flags & C_SUB) if (csrc->mc_flags & C_SUB)
@ -7910,7 +7910,7 @@ static int
mdb_rebalance(MDB_cursor *mc) mdb_rebalance(MDB_cursor *mc)
{ {
MDB_node *node; MDB_node *node;
int rc; int rc, fromleft;
unsigned int ptop, minkeys, thresh; unsigned int ptop, minkeys, thresh;
MDB_cursor mn; MDB_cursor mn;
indx_t oldki; indx_t oldki;
@ -8043,6 +8043,7 @@ mdb_rebalance(MDB_cursor *mc)
return rc; return rc;
mn.mc_ki[mn.mc_top] = 0; mn.mc_ki[mn.mc_top] = 0;
mc->mc_ki[mc->mc_top] = NUMKEYS(mc->mc_pg[mc->mc_top]); mc->mc_ki[mc->mc_top] = NUMKEYS(mc->mc_pg[mc->mc_top]);
fromleft = 0;
} else { } else {
/* There is at least one neighbor to the left. /* There is at least one neighbor to the left.
*/ */
@ -8054,6 +8055,7 @@ mdb_rebalance(MDB_cursor *mc)
return rc; return rc;
mn.mc_ki[mn.mc_top] = NUMKEYS(mn.mc_pg[mn.mc_top]) - 1; mn.mc_ki[mn.mc_top] = NUMKEYS(mn.mc_pg[mn.mc_top]) - 1;
mc->mc_ki[mc->mc_top] = 0; mc->mc_ki[mc->mc_top] = 0;
fromleft = 1;
} }
DPRINTF(("found neighbor page %"Z"u (%u keys, %.1f%% full)", DPRINTF(("found neighbor page %"Z"u (%u keys, %.1f%% full)",
@ -8065,13 +8067,13 @@ mdb_rebalance(MDB_cursor *mc)
* (A branch page must never have less than 2 keys.) * (A branch page must never have less than 2 keys.)
*/ */
if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= thresh && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) { if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= thresh && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) {
rc = mdb_node_move(&mn, mc); rc = mdb_node_move(&mn, mc, fromleft);
if (!mc->mc_ki[mc->mc_top]) { if (fromleft) {
/* if we inserted on left, bump position up */ /* if we inserted on left, bump position up */
oldki++; oldki++;
} }
} else { } else {
if (mc->mc_ki[ptop] == 0) { if (!fromleft) {
rc = mdb_page_merge(&mn, mc); rc = mdb_page_merge(&mn, mc);
} else { } else {
MDB_cursor dummy; MDB_cursor dummy;

Loading…
Cancel
Save