]> 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, 25 Oct 2015 09:55:22 +0000 (10:55 +0100)
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 fb12cf4459e86254e9661e65ec82d8b4b72df828..4a2dd0a51dd0bef378c55a3ffba928b1e1f9631f 100644 (file)
@@ -2681,12 +2681,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
@@ -2697,11 +2701,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",
@@ -2721,10 +2720,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;