Paul B. Henson wrote:
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.
So much for OpenBSD's vaunted attention to detail.
I temporarily tweaked it to always enable MDB_WRITEMAP
That would be the simplest approach.
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.
Nice work, thanks for the update.