From 2a36346b50abbdad1f36338fdbfbdfa16674602c Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 9 Jan 2013 08:30:13 -0800 Subject: [PATCH] ITS#7455 don't give up so soon If we're operating on the freelist, see if our current pghead can satisfy the request before giving up and using new pages. --- libraries/liblmdb/mdb.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 8508dbd..eb4f042 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -1338,7 +1338,7 @@ none: MDB_oldpages *mop = txn->mt_env->me_pghead; if (num > 1) { MDB_cursor m2; - int retry = 60, readit = 0, n2 = num-1; + int retry = 500, readit = 0, n2 = num-1; unsigned int i, j, k; /* If current list is too short, must fetch more and coalesce */ @@ -1347,11 +1347,14 @@ none: mdb_cursor_init(&m2, txn, FREE_DBI, NULL); do { - /* bail out if we're operating on the freelist. + /* If on freelist, don't try to read more. If what we have + * right now isn't enough just use new pages. * TODO: get all of this working. Many circular dependencies... */ - if (mc->mc_dbi == FREE_DBI) - break; + if (mc->mc_dbi == FREE_DBI) { + retry = 0; + readit = 0; + } if (readit) { MDB_val key, data; MDB_oldpages *mop2; @@ -2124,7 +2127,7 @@ mdb_txn_commit(MDB_txn *txn) mdb_cursor_init(&mc, txn, FREE_DBI, NULL); /* should only be one record now */ - if (env->me_pghead) { + if (env->me_pghead || env->me_pgfirst) { /* make sure first page of freeDB is touched and on freelist */ rc = mdb_page_search(&mc, NULL, MDB_PS_MODIFY); if (rc && rc != MDB_NOTFOUND) {