]> git.sur5r.net Git - openldap/commitdiff
ITS#8221 don't merge branch pages needlessly
authorHoward Chu <hyc@openldap.org>
Sat, 26 Sep 2015 15:50:28 +0000 (16:50 +0100)
committerHoward Chu <hyc@openldap.org>
Sun, 27 Sep 2015 21:35:54 +0000 (22:35 +0100)
libraries/liblmdb/mdb.c

index 4e93abcad4b40b46924330402479796dcd7c39f0..50d359ebb007b12b1e3bd4c0cac763482dcd3558 100644 (file)
@@ -7685,17 +7685,23 @@ mdb_rebalance(MDB_cursor *mc)
 {
        MDB_node        *node;
        int rc;
-       unsigned int ptop, minkeys;
+       unsigned int ptop, minkeys, thresh;
        MDB_cursor      mn;
        indx_t oldki;
 
-       minkeys = 1 + (IS_BRANCH(mc->mc_pg[mc->mc_top]));
+       if (IS_BRANCH(mc->mc_pg[mc->mc_top])) {
+               minkeys = 1;
+               thresh = 1;
+       } else {
+               minkeys = 2;
+               thresh = FILL_THRESHOLD;
+       }
        DPRINTF(("rebalancing %s page %"Z"u (has %u keys, %.1f%% full)",
            IS_LEAF(mc->mc_pg[mc->mc_top]) ? "leaf" : "branch",
            mdb_dbg_pgno(mc->mc_pg[mc->mc_top]), NUMKEYS(mc->mc_pg[mc->mc_top]),
                (float)PAGEFILL(mc->mc_txn->mt_env, mc->mc_pg[mc->mc_top]) / 10));
 
-       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]) >= thresh &&
                NUMKEYS(mc->mc_pg[mc->mc_top]) >= minkeys) {
                DPRINTF(("no need to rebalance page %"Z"u, above fill threshold",
                    mdb_dbg_pgno(mc->mc_pg[mc->mc_top])));
@@ -7829,8 +7835,7 @@ mdb_rebalance(MDB_cursor *mc)
         * move one key from it. Otherwise we should try to merge them.
         * (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) {
+       if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= thresh && NUMKEYS(mn.mc_pg[mn.mc_top]) > minkeys) {
                rc = mdb_node_move(&mn, mc);
                if (mc->mc_ki[ptop]) {
                        oldki++;