This is a multi-part message in MIME format.
--------------010403050509060707070108
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
h.b.furuseth(a)usit.uio.no wrote:
Full_Name: Hallvard B Furuseth
Version: RE24 + mdb.master 2d0b362b6f2b1247eb693008a39efaf341f15e82
OS: Linux x86_64
URL:
Submission from: (NULL) (193.69.163.163)
Submitted by: hallvard
test043-delta-syncrepl crashes in RE24 + mdb.master + this patch.
A sub-cursor sees a regular (non-sub) page which has P_SUB set,
in dirty_list. The flag comes from the fake page in cursor_put.
The flag is being propagated when the page grows and turns into a real page.
Fixed by this simple patch.
I don't think we actually want to keep the debug code/flag you added, but I'll
leave it to you to commit.
Patch:
- Set P_FAKE flag for debugging, to see where the flag comes from.
- assert(not P_SUB) in page_get.
- valloc pages so we can see from the page address that it is
a regular page.
--- libraries/liblmdb/mdb.c
+++ libraries/liblmdb/mdb.c
@@ -59,2 +59,3 @@
#include <unistd.h>
+#include <malloc.h>
@@ -582,2 +583,3 @@ typedef struct MDB_page {
#define P_SUBP 0x40 /**< for #MDB_DUPSORT sub-pages */
+#define P_FAKE 0x80 /**< fake page */
/** @} */
@@ -1271,3 +1273,3 @@ mdb_page_malloc(MDB_cursor *mc, unsigned num)
}
- if ((ret = malloc(sz)) != NULL) {
+ if ((ret = valloc(sz)) != NULL) {
VGMEMP_ALLOC(env, ret, sz);
@@ -2478,2 +2480,3 @@ mdb_txn_commit(MDB_txn *txn)
dp = txn->mt_u.dirty_list[i].mptr;
+ assert(!(dp->mp_flags & P_SUBP));
if (dp->mp_pgno != next) {
@@ -4069,2 +4072,3 @@ mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret,
int *lvl)
p = dl[x].mptr;
+ /* assert(!(p->mp_flags & P_SUBP)); */
goto done;
@@ -5164,3 +5168,3 @@ more:
fp->mp_pgno = mc->mc_pg[mc->mc_top]->mp_pgno;
- fp->mp_flags = P_LEAF|P_DIRTY|P_SUBP;
+ fp->mp_flags = P_LEAF|P_DIRTY|P_SUBP|P_FAKE;
fp->mp_lower = PAGEHDRSZ;
--
-- Howard Chu
CTO, Symas Corp.
http://www.symas.com
Director, Highland Sun
http://highlandsun.com/hyc/
Chief Architect, OpenLDAP
http://www.openldap.org/project/
--------------010403050509060707070108
Content-Type: text/plain; charset=UTF-8;
name="dif.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="dif.txt"
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index c9f98cc..1bc0f14 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -5242,6 +5242,7 @@ reuse:
flags |= F_DUPDATA;
}
mp->mp_flags = fp->mp_flags | P_DIRTY;
+ mp->mp_flags &= ~(P_SUBP|P_FAKE);
mp->mp_pad = fp->mp_pad;
mp->mp_lower = fp->mp_lower;
mp->mp_upper = fp->mp_upper + offset;
--------------010403050509060707070108--