Jeremy Bernstein wrote:
Although I didn't figure out a good way to do what I want, this is what I am
now doing:
if (MDB_MAP_FULL while putting) {
abort txn, close the database
reopen the database @ larger mapsize
perform some pruning of dead records
commit txn, close the database
reopen the database @ old mapsize
try to put again
}
At this point, the database is probably larger than the old mapsize. To handle
that, I make a copy of the DB, kill the original, open a new database and
copy the records from the old DB to the new one.
All of this is a lot more complicated and code-verbose than I want, but it
works and seems to be reliable.
Nevertheless, if there's an easier way, I'm all ears. Thanks for your
thoughts.
Use mdb_stat() before performing the _put(). If the total number of pages in
use is large (whatever threshold you choose, e.g. 90%) then start pruning.
Look at the mdb_stat command's output to get an idea of what you're looking for.
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/