Wietse Venema wrote:
Hallvard Breien Furuseth:
Sofar the abstraction layer already hides the LMDB-specific MAP_FULL and MAP_RESIZED error conditions. If this abstraction layer needs additional code in order to maintain MDB cursor sanity, then please educate me.
ldmb.h says --
mdb_env_set_mapsize(): "It may be called at later times if no transactions are active in this process. Note that the library does not check for this condition, the caller must ensure it explicitly." MDB_NOLOCK: "[caller] must ensure that no readers are using old transactions while a writer is active. The simplest approach is to use an exclusive lock so that no readers may be active at all when a writer begins."
That's why I talked about saving the cursor position and restoring it - cursors are per-transaction and you need a new transaction.
I can remember the last key from mdb_cursor_get() and set the cursor to that key. There does not appear to be a cursor "save" operation in the API documentation http://symas.com/mdb/doc/group__mdb.html.
Hallvard is suggesting exactly that - remember the key. There is no cursor "save" operation, any saved state would be meaningless after one write transaction.