Hi,
I have a question regarding growing an LMDB database when a write transaction hits
MDB_MAP_FULL.
I would like to avoid defining a high mapsize value because my application will contain
many MDB_envs, and because I have Windows users (Windows allocates the whole file on the
disk).
Based on the intuition that MDB_MAP_FULL should not leave the database in a weird state, I
have made the following little experiment. When MDB_MAP_FULL is encountered I tried to:
* copy the current env (mdb_env_copy) into another directory (fine: it does not
seem to contain uncommited data)
* reset the transaction < error bit > (modified LMDB code to introduce a
< txn->mt_flags &= ~MDB_TXN_ERROR > somewhere)
* commit the transaction
* close the database
* close the env
* reopen it with a higher mapsize value
* reopen the database
* create another transaction
* continue writing
... and it seems to be working pretty well.
Assuming I am ready to < relax > some of the ACID requirements, does it sound
reasonable to think that MDB_MAP_FULL does not leave LMDB is a weird state? And that the
< trick > described above should always be working? By < working > I mean: the
copied environment will never contain uncommitted data (so I can rely on it to implement a
kind of rollback), the reopened environment will always be valid and contain the expected
data (data written before hitting MDB_MAP_FULL)?
Thanks in advance for any insight,
Best regards,
Bruno.