From 05ec98d11927a5148bbea8ed5672fdf61609b6cd Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sun, 22 Jul 2012 17:41:58 -0700 Subject: [PATCH 1/2] Append mode still needs to detect duplicates --- libraries/libmdb/mdb.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index ad9ff44802..21fa97792c 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -4247,8 +4247,11 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_val k2; rc = mdb_cursor_last(mc, &k2, &d2); if (rc == 0) { - rc = MDB_NOTFOUND; - mc->mc_ki[mc->mc_top]++; + rc = mc->mc_dbx->md_cmp(key, &k2); + if (rc) { + rc = MDB_NOTFOUND; + mc->mc_ki[mc->mc_top]++; + } } } else { rc = mdb_cursor_set(mc, key, &d2, MDB_SET, &exact); From ccc4d23e749edc5ea461261427a0ee0a663fdfe5 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sun, 22 Jul 2012 17:42:36 -0700 Subject: [PATCH 2/2] Leave extra space when creating a fake page Minimizes the number of memcpy's if additional dups are stored. --- libraries/libmdb/mdb.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 21fa97792c..be009ced55 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -4321,6 +4321,7 @@ more: if (mc->mc_db->md_flags & MDB_DUPFIXED) { fp->mp_flags |= P_LEAF2; fp->mp_pad = data->mv_size; + fp->mp_upper += 2 * data->mv_size; /* leave space for 2 more */ } else { fp->mp_upper += 2 * sizeof(indx_t) + 2 * NODESIZE + (dkey.mv_size & 1) + (data->mv_size & 1); @@ -4341,6 +4342,7 @@ more: fp = NODEDATA(leaf); if (flags == MDB_CURRENT) { +reuse: fp->mp_flags |= P_DIRTY; COPY_PGNO(fp->mp_pgno, mc->mc_pg[mc->mc_top]->mp_pgno); mc->mc_xcursor->mx_cursor.mc_pg[0] = fp; @@ -4349,6 +4351,9 @@ more: } if (mc->mc_db->md_flags & MDB_DUPFIXED) { offset = fp->mp_pad; + if (SIZELEFT(fp) >= offset) + goto reuse; + offset *= 4; /* space for 4 more */ } else { offset = NODESIZE + sizeof(indx_t) + data->mv_size; }