Wietse Venema:
env can be NULL. mdb_env_set_assert(env,cb) also sets a static variable with the callback for the asserts which do not know of an env. Could throw away that part later. Currently it only applies to one assert().
The branch also invalidates a transaction on any page allocation error, since the callers do not always clean up afterwards. Too aggressive, can be reverted after updating the callers. But for now it means MDB_MAP_FULL & co won't let the user commit an inconsistent transaction.
Thanks, this is more improvement than I asked for. I don't want to slip my schedule, and to avoid last-minute surprises, I will postpone the review and impact test of these improvements after the stable Postfix release 2-3 weeks from today.
It looks like you are switching from a stop-gap fix (bare-bones call-back) to a more permanent solution.
In that case I must mention again that I need to register not only a call-back function pointer but also a void* pointer that is returned to me at call-back time.
Getting the MDB_env at call-back time does not help me at all, because my programs open many databases (including non-LMDB).
To find out which database is affected I need my own pointer to my own (DICT) object that encapsulates the LMDB database. Then I can decide if the problem is with a disposable cache. in which case the program can continue with degraded performance.
Wietse