]> git.sur5r.net Git - openldap/commitdiff
ITS#7377 Always notice env error on txn startup.
authorHallvard Furuseth <hallvard@openldap.org>
Sun, 19 Jul 2015 19:43:10 +0000 (21:43 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Sun, 19 Jul 2015 19:43:10 +0000 (21:43 +0200)
Move the check to the end of txn startup.  Catches env
breakage which happens while the new txn waits for a lock.

libraries/liblmdb/mdb.c

index b67bf09becbf9acd8b4f7047f25fc31598c90b3a..532d94a7d797c5a471957421b010f9586db6b2d0 100644 (file)
@@ -2743,12 +2743,16 @@ mdb_txn_renew0(MDB_txn *txn)
        txn->mt_dbflags[MAIN_DBI] = DB_VALID|DB_USRVALID;
        txn->mt_dbflags[FREE_DBI] = DB_VALID;
 
-       if (env->me_maxpg < txn->mt_next_pgno) {
-               mdb_txn_end(txn, new_notls /*0 or MDB_END_SLOT*/ | MDB_END_FAIL_BEGIN);
-               return MDB_MAP_RESIZED;
+       if (env->me_flags & MDB_FATAL_ERROR) {
+               DPUTS("environment had fatal error, must shutdown!");
+               rc = MDB_PANIC;
+       } else if (env->me_maxpg < txn->mt_next_pgno) {
+               rc = MDB_MAP_RESIZED;
+       } else {
+               return MDB_SUCCESS;
        }
-
-       return MDB_SUCCESS;
+       mdb_txn_end(txn, new_notls /*0 or MDB_END_SLOT*/ | MDB_END_FAIL_BEGIN);
+       return rc;
 }
 
 int
@@ -2759,11 +2763,6 @@ mdb_txn_renew(MDB_txn *txn)
        if (!txn || !F_ISSET(txn->mt_flags, MDB_TXN_RDONLY|MDB_TXN_FINISHED))
                return EINVAL;
 
-       if (txn->mt_env->me_flags & MDB_FATAL_ERROR) {
-               DPUTS("environment had fatal error, must shutdown!");
-               return MDB_PANIC;
-       }
-
        rc = mdb_txn_renew0(txn);
        if (rc == MDB_SUCCESS) {
                DPRINTF(("renew txn %"Z"u%c %p on mdbenv %p, root page %"Z"u",
@@ -2783,10 +2782,6 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
        flags &= MDB_TXN_BEGIN_FLAGS;
        flags |= env->me_flags & MDB_WRITEMAP;
 
-       if (env->me_flags & MDB_FATAL_ERROR) {
-               DPUTS("environment had fatal error, must shutdown!");
-               return MDB_PANIC;
-       }
        if (env->me_flags & MDB_RDONLY & ~flags) /* write txn in RDONLY env */
                return EACCES;