Wietse Venema writes:
As written in the bug report the assertion also failed with mdb_map_size set to an insanely large value (half a billion) in which case the map size never changes.
Yes...
But, it is good to know that the cursor is invalidated by both map size changes and transactions that change the database.
No, that's the wrong idea. This is a case of a user error breaking snapshot isolation: Ending the transaction invalidates its cursors, and you have to end the transaction in these two cases (modifying when using MDB_NOLOCK, or resizing).
Those are "user errors" because that made it simple to code those features. We could add code to make them non-errors on in common cases and on common hosts, but I'm not sure if that's worth the trouble.
I can confirm that with LMDB-0.9.10 + ITS#7756 patch, the assertion failure goes away when I close the cursor (and its read transaction) before changing the map or the database, and restore the cursor afterwards. I guess this got broken when things were changed to use external locks in order to avoid world-writable lockfiles.
Yes.
Ending the read-only transaction and starting a new one means you are no longer seeing the same snapshot, though. So I hope the reason you couldn't use single transaction which I suggested previously, was that the reader transaction needed to keep seeing the same snapshot.