From 4844a72d012ec4340ad62b9d4ed648a1d7a5cd53 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 3 Apr 2014 12:51:41 -0700 Subject: [PATCH] ITS#7829 more for mdb_rebalance Make sure to propagate rebalance results all the way back to original caller's cursor. --- libraries/liblmdb/mdb.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 2e47bc0..e0f551e 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -7283,9 +7283,18 @@ mdb_page_merge(MDB_cursor *csrc, MDB_cursor *cdst) } } } - mdb_cursor_pop(csrc); - - return mdb_rebalance(csrc); + { + unsigned int snum = cdst->mc_snum; + uint16_t depth = cdst->mc_db->md_depth; + mdb_cursor_pop(cdst); + rc = mdb_rebalance(cdst); + /* Did the tree shrink? */ + if (depth > cdst->mc_db->md_depth) + snum--; + cdst->mc_snum = snum; + cdst->mc_top = snum-1; + } + return rc; } /** Copy the contents of a cursor. @@ -7474,7 +7483,7 @@ mdb_rebalance(MDB_cursor *mc) oldki += 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); - mc->mc_pg[mc->mc_top] = mn.mc_pg[mn.mc_top]; + mdb_cursor_copy(&mn, mc); } mc->mc_flags &= ~C_EOF; }