]> git.sur5r.net Git - openldap/commitdiff
ITS#7385, check further for bad splits
authorHoward Chu <hyc@symas.com>
Thu, 27 Sep 2012 12:01:53 +0000 (05:01 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 27 Sep 2012 12:06:23 +0000 (05:06 -0700)
More for 48ef27b6f5c804eca6a9d27f8dd2b4ded376f8af
Our definition of "large" data item needs to be smaller to
handle more cases where a bad split is possible

libraries/libmdb/mdb.c

index 807294c28dda61904cedad5dc4512be67469b11e..d15fa7c8a7e8d22ffad8af0d5ccf2cf183466bc5 100644 (file)
@@ -6117,15 +6117,19 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
         * This check is only needed when the data items are
         * relatively large, such that being off by one will
         * make the difference between success or failure.
-        * When the size of the data items is much smaller than
-        * one-half of a page, this check is irrelevant.
+        *
+        * It's also relevant if a page happens to be laid out
+        * such that one half of its nodes are all "small" and
+        * the other half of its nodes are "large." If the new
+        * item is also "large" and falls on the half with
+        * "large" nodes, it also may not fit.
         */
        if (IS_LEAF(mp)) {
                unsigned int psize, nsize;
                /* Maximum free space in an empty page */
                pmax = mc->mc_txn->mt_env->me_psize - PAGEHDRSZ;
                nsize = mdb_leaf_size(mc->mc_txn->mt_env, newkey, newdata);
-               if ((nkeys < 20) || (nsize > pmax/4)) {
+               if ((nkeys < 20) || (nsize > pmax/16)) {
                        if (newindx <= split_indx) {
                                psize = nsize;
                                newpos = 0;