https://bugs.openldap.org/show_bug.cgi?id=9278
Issue ID: 9278 Summary: liblmdb: robust mutexes should not be unmapped Product: LMDB Version: unspecified Hardware: All OS: FreeBSD Status: UNCONFIRMED Severity: normal Priority: --- Component: liblmdb Assignee: bugs@openldap.org Reporter: delphij@freebsd.org Target Milestone: ---
Created attachment 736 --> https://bugs.openldap.org/attachment.cgi?id=736&action=edit A possible workaround
We recently noticed that lmdb would have the memory region containing the robust mutex unmapped on mdb_env_close0():
munmap((void *)env->me_txns, (env->me_maxreaders-1)*sizeof(MDB_reader)+sizeof(MDB_txninfo));
Note that if this is the last unmap for a robust mutex, the FreeBSD implementation would garbage-collect the mutex, making it no longer visible to other processes. As the result, a second instance of the attached test.c (from https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=244493 with minor changes) would trigger the assertion at mdb_txn_begin() because the acquisition of the mutex would return 22 (EINVAL), because the mutex appeared to be a robust mutex, but was invalid.
The attached lmdb.diff is a possible workaround for this (it would skip unmapping when setting up the robust mutex for the first time).