]> git.sur5r.net Git - openldap/commitdiff
ITS#7515 mdb_dbi_open(): Also open in parent txns.
authorHallvard Furuseth <hallvard@openldap.org>
Tue, 19 Feb 2013 21:01:29 +0000 (22:01 +0100)
committerHallvard Furuseth <hallvard@openldap.org>
Tue, 19 Feb 2013 21:01:29 +0000 (22:01 +0100)
This makes aborting nested and non-nested txns more
similar: The new DBI is available to the surrounding
context (parent txn and MDB_env respectively).

libraries/liblmdb/lmdb.h
libraries/liblmdb/mdb.c

index 646d456e31c608c16b10fc095ea4120271de3ad4..b91de4df96156d02cf6254adecfc6a87ff299b58 100644 (file)
@@ -757,10 +757,15 @@ int  mdb_txn_renew(MDB_txn *txn);
 
        /** @brief Open a database in the environment.
         *
-        * The database handle may be discarded by calling #mdb_dbi_close().  The
+        * The database handle may be discarded by calling #mdb_dbi_close().
+        * It denotes the name and parameters of a database, independently of
+        * whether such a database exists. It will not exist if the transaction
+        * which created it aborted, nor if another process deleted it. The
         * database handle resides in the shared environment, it is not owned
         * by the given transaction. Only one thread should call this function;
         * it is not mutex-protected in a read-only transaction.
+        * Preexisting transactions, other than the current transaction and
+        * any parents, must not use the new handle. Nor must their children.
         * To use named databases (with name != NULL), #mdb_env_set_maxdbs()
         * must be called before opening the environment.
         * @param[in] txn A transaction handle returned by #mdb_txn_begin()
index 368cf5227f7bf3fd1eac09d13fea0656f6487cbb..60189683edddb89b16fef4dbc46bb171fdc6bada 100644 (file)
@@ -6953,6 +6953,7 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
        MDB_val key, data;
        MDB_dbi i;
        MDB_cursor mc;
+       uint16_t mdflags;
        int rc, dbflag, exact;
        unsigned int unused = 0;
        size_t len;
@@ -7035,12 +7036,19 @@ int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *db
                txn->mt_dbflags[slot] = dbflag;
                memcpy(&txn->mt_dbs[slot], data.mv_data, sizeof(MDB_db));
                *dbi = slot;
-               txn->mt_env->me_dbflags[slot] = txn->mt_dbs[slot].md_flags;
+               txn->mt_env->me_dbflags[slot] = mdflags = txn->mt_dbs[slot].md_flags;
                mdb_default_cmp(txn, slot);
                if (!unused) {
                        txn->mt_numdbs++;
                        txn->mt_env->me_numdbs++;
                }
+               /* Open the DB in parent txns as well */
+               while ((txn = txn->mt_parent) != NULL) {
+                       txn->mt_dbflags[slot] = DB_STALE;
+                       txn->mt_dbs[slot].md_flags = mdflags;
+                       if (!unused)
+                               txn->mt_numdbs++;
+               }
        }
 
        return rc;