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

libraries/liblmdb/mdb.c

index e51d22db7dc45b0880b601464bc5ebab7ea26812..5c684afe6cc6151fbf05843943f151a795fbf9d0 100644 (file)
@@ -10436,9 +10436,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
@@ -10479,7 +10483,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) {