[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: LMDB: issue with mdb_cursor_del
On 16/10/17 14:56, Hallvard Breien Furuseth wrote:
On 16. okt. 2017 13:43, Леонид Юрьев wrote:
(...)
Inside freelist_save() the mt_loose_pages could be merged into the
mt_free_pgs.
http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=libraries/liblmdb/mdb.c;h=1bf81ed4c87901991b7cac885b0d8cbc4dd23436;hb=bb8502f08800a44a6b91a94d6478aa7101c4cc77#l3444
But at this point all loose_pages also still present in the
mt_u.dirty_list.
(...)
I don't understand you. page_alloc doesn't call mdb_mid2l_insert()
for loose pages, since they are in dirty_list.
Duh, never mind, I was reading your explanation backwards.
So, when freelist_save() returns loose pages to mt_free_pgs(), you
remove them from mt_u.dirty_list and update dirty_room. OK.
Howard, I accidentally suggested a different fix to this recently.
Maybe in LMDB 1.0 we should switch to this:
Set INITIAL_TXNID > 2, so freelist_save() always has an unused freeDB
key < txnid which it can back up to. Now allow ovpage_free() and
freelist_save() to create me_pghead. That means finding a nonzero
value to set me_pglast to as well, or removing the assumtion that
me_phead == NULL if me_pglast == 0.
Discussed on irc on Aug 10 and rejected, but it may be cleaner
after all - freelist_save() can quit messing with loose pages
instead of adding to the code which does that.
Unless we also rejected it because it wouldn't work:-)
--
Hallvard