[Date Prev][Date Next] [Chronological] [Thread] [Top]

LMDB: MDB_MAP_FULL doesn't allow deletions

Hi OpenLDAP-Technical,

First post, thanks in advance for any assistance.

I am trying to manage database size for an application in which a fixed DB size is necessary (user-specified and these users are ornery). My preferred strategy is:

- write to the DB until it's (nearly?) full
- at that point, prune entries matching a certain criteria (either deleting them or backing them up to an auxiliary DB of some sort).

I have all of this working, in fact, except that once I hit MDB_MAP_FULL on mdb_put(), I can no longer do anything with the DB, including deleting records. mdb_cursor_del() also returns MDB_MAP_FULL at that point.

If I had some idea of when the DB was nearly full, I could do my pruning prophylactically, I guess. Resizing the database upward isn't really a solution, given the constraints of this particular application.

Some other observations:
- on OSX (BSD?), if I do not set MDB_WRITEMAP in mdb_env_open(), MDB_MAP_FULL is _never_ returned, even when the DB is full. Setting MDB_WRITEMAP disables DB sparseness, though (so my 64MB-mapsize db with one record is 64MB on disk). Bug or feature?

- on Windows, the database size is always the same as the mapsize. Possibly there's simply no support for sparse MM files on Windows, but I thought it's worth checking.

OK, that's enough for the first post, thanks once again for any insight.

Jeremy Bernstein

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail