]> git.sur5r.net Git - openldap/commitdiff
ITS#7121 fix page splits when data+key size is too large
authorHoward Chu <hyc@openldap.org>
Wed, 4 Jan 2012 23:25:18 +0000 (15:25 -0800)
committerHoward Chu <hyc@openldap.org>
Wed, 4 Jan 2012 23:27:15 +0000 (15:27 -0800)
libraries/libmdb/mdb.c

index bec30d3e06062bbb0083c3b2227bfcb6f4795932..d953ef941a3ae4614ec29ca43666be8f05581ab2 100644 (file)
@@ -4342,7 +4342,7 @@ mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data)
        size_t           sz;
 
        sz = LEAFSIZE(key, data);
-       if (data->mv_size >= env->me_psize / MDB_MINKEYS) {
+       if (sz >= env->me_psize / MDB_MINKEYS) {
                /* put on overflow page */
                sz -= data->mv_size - sizeof(pgno_t);
        }
@@ -4435,11 +4435,11 @@ mdb_node_add(MDB_cursor *mc, indx_t indx,
                if (F_ISSET(flags, F_BIGDATA)) {
                        /* Data already on overflow page. */
                        node_size += sizeof(pgno_t);
-               } else if (data->mv_size >= mc->mc_txn->mt_env->me_psize / MDB_MINKEYS) {
+               } else if (node_size + data->mv_size >= mc->mc_txn->mt_env->me_psize / MDB_MINKEYS) {
                        int ovpages = OVPAGES(data->mv_size, mc->mc_txn->mt_env->me_psize);
                        /* Put data on overflow page. */
-                       DPRINTF("data size is %zu, put on overflow page",
-                           data->mv_size);
+                       DPRINTF("data size is %zu, node would be %zu, put data on overflow page",
+                           data->mv_size, node_size+data->mv_size);
                        node_size += sizeof(pgno_t);
                        if ((ofp = mdb_page_new(mc, P_OVERFLOW, ovpages)) == NULL)
                                return ENOMEM;