]> git.sur5r.net Git - openldap/commitdiff
ITS#7455 don't give up so soon
authorHoward Chu <hyc@openldap.org>
Wed, 9 Jan 2013 16:30:13 +0000 (08:30 -0800)
committerHoward Chu <hyc@openldap.org>
Wed, 9 Jan 2013 16:30:13 +0000 (08:30 -0800)
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

index 8508dbd62fd6afa84047bd62181bf6c81943fcb8..eb4f0425eff94ad50ae638ceb63c25c08f114f29 100644 (file)
@@ -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) {