]> git.sur5r.net Git - openldap/commitdiff
ITS#7538 fallout from ITS#7536 fix.
authorHoward Chu <hyc@symas.com>
Wed, 13 Mar 2013 00:29:34 +0000 (17:29 -0700)
committerHoward Chu <hyc@symas.com>
Wed, 13 Mar 2013 00:29:34 +0000 (17:29 -0700)
Allow leaf pages to have only 1 key.

libraries/liblmdb/mdb.c

index a2a2e528a720eaa98d54c9245d8fa4c49f5de215..cf306fcb77ae724884205d2fdc0b77a4ff25b920 100644 (file)
@@ -6250,7 +6250,7 @@ static int
 mdb_rebalance(MDB_cursor *mc)
 {
        MDB_node        *node;
-       int rc;
+       int rc, minkeys;
        unsigned int ptop;
        MDB_cursor      mn;
 
@@ -6380,13 +6380,12 @@ 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 three
-        * keys, move one key from it. (A page must never have fewer than
-        * 2 keys.)
-        *
-        * Otherwise we should try to merge them.
+       /* If the neighbor page is above threshold and has enough keys,
+        * move one key from it. Otherwise we should try to merge them.
+        * (A branch page must never have less than 2 keys.)
         */
-       if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) > 2)
+       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)