[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: mdb broken under OpenBSD



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.

--
  -- Howard Chu
  CTO, Symas Corp.           http://www.symas.com
  Director, Highland Sun     http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP  http://www.openldap.org/project/