Thank you!
It appears that mdb_dbi_open() must be called before any read / write access to a database in a transaction, and all read / write have to be done in a transaction? If this is the case, is it correct that due to the concurrency restriction above, there is essentially no concurrent access (including read and write) to the same database in a multi-threaded process, since a database is available to one transaction in a time?
2015-03-30 19:52 GMT+08:00 Hallvard Breien Furuseth < h.b.furuseth@usit.uio.no>:
You're abusing mdb_dbi_open(). Its doc says:
"This function must not be called from multiple concurrent transactions in the same process. A transaction that uses this function must finish (either commit or abort) before any other transaction in the process may use this function."
That text could have stood out a bit better in the doc:-(
The error is simple for lmdb to try to catch, though without locking it cannot guarantee to catch it. Try this patch: http://folk.uio.no/hbf/OpenLDAP/mdb.serial-open.diff
(Howard, this is branch "mdb/serial-open" in my UiO repo.) Not sure if it should do more than this. E.g. attack mdb_drop too. Maybe set MDB_TXN_ERROR since a program with broken threading can break the DB.
-- Hallvard