]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9806 LMDB page_split: key threshold depends on page size
authorHoward Chu <hyc@openldap.org>
Mon, 28 Nov 2022 14:29:53 +0000 (14:29 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 28 Nov 2022 14:29:53 +0000 (14:29 +0000)
32 was chosen for page size of 4KB. Not large nough for 16KB pages.

libraries/liblmdb/mdb.c

index fa01bb9bc5a6e7877d3f3b2dce80737a4f5beaba..ec49ac06a4b9443c8b638ca3cc211867e7f9d0be 100644 (file)
@@ -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) {