On Thu, Aug 03, 2017 at 02:20:29PM -0700, Paul B. Henson wrote:
From my initial look, mdb_env_create() successfully sets mdb->mi_dbenv, it's still valid in mdb_db_open(), but by the time it reaches be->be_entry_put in slapadd() it's NULL :(.
It turned out it was only sometimes NULL. The culprit was actually the local OpenBSD patch that was added to mdb_db_open() to ensure MDB_WRITEMAP is always set:
if ( !(flags & MDB_WRITEMAP) ) { Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_db_open) ": database "%s" does not have writemap. " "This is required on systems without unified buffer cache.\n", be->be_suffix[0].bv_val, rc, 0 ); goto fail; }
There were two problems with it; first, it accesses the local flags variable before it is initialized to mdb->mi_dbenv_flags shortly thereafter, so the value is random and the if block nondeterministically triggers, and second, it doesn't assign a failure value to rc before it jumps to fail:, so the function returns successfully but with a closed be.
mdb has been disabled for a while, so I'm guessing the first issue might have occurred over time as backend.c changed and the patch was just blindly updated without testing. The second issue I'm not sure about.
I temporarily tweaked it to always enable MDB_WRITEMAP so I could run the mdb test suite (which doesn't have it enabled for everything) and so far it seems to be working.
I would hope that this simple issue isn't why they've had it disabled all this time, but I guess I'll see what happens with the full test suite as it progresses.