From: Howard Chu Date: Mon, 28 Nov 2022 14:29:53 +0000 (+0000) Subject: ITS#9806 LMDB page_split: key threshold depends on page size X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6a1954d0ae6876b70f503121483a1c5107a910c2;p=thirdparty%2Fopenldap.git ITS#9806 LMDB page_split: key threshold depends on page size 32 was chosen for page size of 4KB. Not large nough for 16KB pages. --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index fa01bb9bc5..ec49ac06a4 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -9754,9 +9754,13 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno mc->mc_ki[mc->mc_top] = x; } } else { - int psize, nsize, k; + int psize, nsize, k, keythresh; + /* Maximum free space in an empty page */ pmax = env->me_psize - PAGEHDRSZ; + /* Threshold number of keys considered "small" */ + keythresh = env->me_psize >> 7; + if (IS_LEAF(mp)) nsize = mdb_leaf_size(env, newkey, newdata); else @@ -9797,7 +9801,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno * the split so the new page is emptier than the old page. * This yields better packing during sequential inserts. */ - if (nkeys < 32 || nsize > pmax/16 || newindx >= nkeys) { + if (nkeys < keythresh || nsize > pmax/16 || newindx >= nkeys) { /* Find split point */ psize = 0; if (newindx <= split_indx || newindx >= nkeys) {