From: Howard Chu Date: Fri, 28 Mar 2014 20:51:59 +0000 (-0700) Subject: ITS#7829 fix rebalance X-Git-Tag: OPENLDAP_REL_ENG_2_4_40~132^2~17 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ac3acc121855e4297d597a4d71e9863e1e1e2450;p=openldap ITS#7829 fix rebalance Fixup cursor state after node_move/page_merge --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 4e9162f2e2..af190c6afd 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -7323,6 +7323,7 @@ mdb_rebalance(MDB_cursor *mc) int rc; unsigned int ptop, minkeys; MDB_cursor mn; + indx_t oldki; minkeys = 1 + (IS_BRANCH(mc->mc_pg[mc->mc_top])); DPRINTF(("rebalancing %s page %"Z"u (has %u keys, %.1f%% full)", @@ -7427,6 +7428,7 @@ mdb_rebalance(MDB_cursor *mc) mdb_cursor_copy(mc, &mn); mn.mc_xcursor = NULL; + oldki = mc->mc_ki[mc->mc_top]; if (mc->mc_ki[ptop] == 0) { /* We're the leftmost leaf in our parent. */ @@ -7460,17 +7462,21 @@ mdb_rebalance(MDB_cursor *mc) * (A branch page must never have less than 2 keys.) */ minkeys = 1 + (IS_BRANCH(mn.mc_pg[mn.mc_top])); - if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) - return mdb_node_move(&mn, mc); - else { - if (mc->mc_ki[ptop] == 0) + if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) { + rc = mdb_node_move(&mn, mc); + mc->mc_ki[mc->mc_top] = oldki; + } else { + if (mc->mc_ki[ptop] == 0) { rc = mdb_page_merge(&mn, mc); - else { + mc->mc_ki[mc->mc_top] = oldki; + } else { + unsigned int nkeys = NUMKEYS(mn.mc_pg[mn.mc_top]); mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1; rc = mdb_page_merge(mc, &mn); mdb_cursor_copy(&mn, mc); + mc->mc_ki[mc->mc_top] = oldki + nkeys; } - mc->mc_flags &= ~(C_INITIALIZED|C_EOF); + mc->mc_flags &= ~C_EOF; } return rc; }