ITS#7121 fix page splits when data+key size is too large

vmware
Howard Chu 13 years ago committed by Howard Chu
parent 81afbb2fca
commit a17f8e7326
  1. 8
      libraries/libmdb/mdb.c

@ -4342,7 +4342,7 @@ mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data)
size_t sz; size_t sz;
sz = LEAFSIZE(key, data); sz = LEAFSIZE(key, data);
if (data->mv_size >= env->me_psize / MDB_MINKEYS) { if (sz >= env->me_psize / MDB_MINKEYS) {
/* put on overflow page */ /* put on overflow page */
sz -= data->mv_size - sizeof(pgno_t); 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)) { if (F_ISSET(flags, F_BIGDATA)) {
/* Data already on overflow page. */ /* Data already on overflow page. */
node_size += sizeof(pgno_t); 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); int ovpages = OVPAGES(data->mv_size, mc->mc_txn->mt_env->me_psize);
/* Put data on overflow page. */ /* Put data on overflow page. */
DPRINTF("data size is %zu, put on overflow page", DPRINTF("data size is %zu, node would be %zu, put data on overflow page",
data->mv_size); data->mv_size, node_size+data->mv_size);
node_size += sizeof(pgno_t); node_size += sizeof(pgno_t);
if ((ofp = mdb_page_new(mc, P_OVERFLOW, ovpages)) == NULL) if ((ofp = mdb_page_new(mc, P_OVERFLOW, ovpages)) == NULL)
return ENOMEM; return ENOMEM;

Loading…
Cancel
Save