Fix mdb_rebalance
authorHoward Chu <hyc@symas.com>
Mon, 15 Apr 2013 06:59:54 +0000 (23:59 -0700)
committerHoward Chu <hyc@symas.com>
Mon, 15 Apr 2013 06:59:54 +0000 (23:59 -0700)
Need to check NUMKEYS as well as fill threshold, when deciding
whether to change anything. Don't let the page drop below the
minimum number of keys.

libraries/liblmdb/mdb.c

index 8a2875c..ca669f2 100644 (file)
@@ -6295,6 +6295,7 @@ mdb_rebalance(MDB_cursor *mc)
        unsigned int ptop, minkeys;
        MDB_cursor      mn;
 
+       minkeys = 1 + (IS_BRANCH(mc->mc_pg[mc->mc_top]));
 #if MDB_DEBUG
        {
        pgno_t pgno;
@@ -6305,7 +6306,8 @@ mdb_rebalance(MDB_cursor *mc)
        }
 #endif
 
-       if (PAGEFILL(mc->mc_txn->mt_env, mc->mc_pg[mc->mc_top]) >= FILL_THRESHOLD) {
+       if (PAGEFILL(mc->mc_txn->mt_env, mc->mc_pg[mc->mc_top]) >= FILL_THRESHOLD &&
+               NUMKEYS(mc->mc_pg[mc->mc_top] >= minkeys)) {
 #if MDB_DEBUG
                pgno_t pgno;
                COPY_PGNO(pgno, mc->mc_pg[mc->mc_top]->mp_pgno);