]> git.sur5r.net Git - openldap/commitdiff
ITS#7536 fix mdb_rebalance
authorHoward Chu <hyc@openldap.org>
Wed, 6 Mar 2013 20:30:37 +0000 (12:30 -0800)
committerHoward Chu <hyc@symas.com>
Wed, 6 Mar 2013 23:10:22 +0000 (15:10 -0800)
A page must always have at least 2 keys (unless it's a root page)

libraries/liblmdb/mdb.c

index 4d8bfa3bdce5d025a4c8f0e7182a25cb4eda067e..058c68b3ce8271009ffe2b3e1f6f1130549804a3 100644 (file)
@@ -6368,12 +6368,13 @@ mdb_rebalance(MDB_cursor *mc)
        DPRINTF("found neighbor page %zu (%u keys, %.1f%% full)",
            mn.mc_pg[mn.mc_top]->mp_pgno, NUMKEYS(mn.mc_pg[mn.mc_top]), (float)PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) / 10);
 
-       /* If the neighbor page is above threshold and has at least two
-        * keys, move one key from it.
+       /* If the neighbor page is above threshold and has at least three
+        * keys, move one key from it. (A page must never have fewer than
+        * 2 keys.)
         *
         * Otherwise we should try to merge them.
         */
-       if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) >= 2)
+       if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) > 2)
                return mdb_node_move(&mn, mc);
        else {
                if (mc->mc_ki[ptop] == 0)