From 3eb38d2f1bcd98e540057a265da3c2830702bf66 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 23 Nov 2015 13:11:29 +0000 Subject: [PATCH] mdbx: backport - ITS#8323 Fix nested commit. Must remove our spilled pages from parent's dirty list Change-Id: Ic37bcea4975801e48832968ea38050064a581d21 --- CHANGES | 1 + mdb.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/CHANGES b/CHANGES index 03db4c3f..2301bd42 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ LMDB 0.9.17 Release Engineering Fix ITS#8312 loose pages in nested txn Fix ITS#8313 mdb_rebalance dummy cursor Fix ITS#8315 dirty_room in nested txn + Fix ITS#8323 dirty_list in nested txn Fix ITS#8316 page_merge cursor tracking Fix ITS#8319 mdb_load error messages Fix ITS#8320 mdb_load plaintext input diff --git a/mdb.c b/mdb.c index c2555138..570e9928 100644 --- a/mdb.c +++ b/mdb.c @@ -3761,6 +3761,25 @@ mdb_txn_commit(MDB_txn *txn) pspill[0] = y; } + /* Remove anything in our spill list from parent's dirty list */ + if (txn->mt_spill_pgs && txn->mt_spill_pgs[0]) { + for (i=1; i<=txn->mt_spill_pgs[0]; i++) { + MDB_ID pn = txn->mt_spill_pgs[i]; + if (pn & 1) + continue; /* deleted spillpg */ + pn >>= 1; + y = mdb_mid2l_search(dst, pn); + if (y <= dst[0].mid && dst[y].mid == pn) { + free(dst[y].mptr); + while (y < dst[0].mid) { + dst[y] = dst[y+1]; + y++; + } + dst[0].mid--; + } + } + } + /* Find len = length of merging our dirty list with parent's */ x = dst[0].mid; dst[0].mid = 0; /* simplify loops */