]> 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:32:33 +0000 (14:32 +0000)
32 was chosen for page size of 4KB. Not large nough for 16KB pages.

libraries/liblmdb/mdb.c

index b64e3a60d6424cd8fc7f0c7b1897eee750c7766f..617b02bb0f79c6cef088a584c49fe0a0ebbc1482 100644 (file)
@@ -8737,9 +8737,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
@@ -8780,7 +8784,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) {