summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHoward Chu <hyc@openldap.org>2016-04-09 20:42:45 +0100
committerHoward Chu <hyc@openldap.org>2016-04-09 20:42:45 +0100
commitc8dbd772f751471fd2824bbb27ac9b8b392af465 (patch)
treea476becce056d188ae9a0b92ef37e0da913c98c9
parent8fff90db7ed1e650395f39f9e8b22673aa74aa2b (diff)
downloadlmdb-c8dbd772f751471fd2824bbb27ac9b8b392af465.tar.gz
lmdb-c8dbd772f751471fd2824bbb27ac9b8b392af465.tar.bz2
lmdb-c8dbd772f751471fd2824bbb27ac9b8b392af465.zip
mdb_drop optimization
If we know there are no sub-DBs and no overflow pages, skip leaf scan.
-rw-r--r--libraries/liblmdb/mdb.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index acab07b..2d8e458 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -10501,8 +10501,11 @@ mdb_drop0(MDB_cursor *mc, int subs)
/* DUPSORT sub-DBs have no ovpages/DBs. Omit scanning leaves.
* This also avoids any P_LEAF2 pages, which have no nodes.
+ * Also if the DB doesn't have sub-DBs and has no overflow
+ * pages, omit scanning leaves.
*/
- if (mc->mc_flags & C_SUB)
+ if ((mc->mc_flags & C_SUB) ||
+ (!subs && !mc->mc_db->md_overflow_pages))
mdb_cursor_pop(mc);
mdb_cursor_copy(mc, &mx);
@@ -10529,6 +10532,9 @@ mdb_drop0(MDB_cursor *mc, int subs)
pg, omp->mp_pages);
if (rc)
goto done;
+ mc->mc_db->md_overflow_pages -= omp->mp_pages;
+ if (!mc->mc_db->md_overflow_pages && !subs)
+ break;
} else if (subs && (ni->mn_flags & F_SUBDATA)) {
mdb_xcursor_init1(mc, ni);
rc = mdb_drop0(&mc->mc_xcursor->mx_cursor, 0);
@@ -10536,6 +10542,8 @@ mdb_drop0(MDB_cursor *mc, int subs)
goto done;
}
}
+ if (!subs && !mc->mc_db->md_overflow_pages)
+ goto pop;
} else {
if ((rc = mdb_midl_need(&txn->mt_free_pgs, n)) != 0)
goto done;
@@ -10557,6 +10565,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
/* no more siblings, go back to beginning
* of previous level.
*/
+pop:
mdb_cursor_pop(mc);
mc->mc_ki[0] = 0;
for (i=1; i<mc->mc_snum; i++) {