This is a multi-part message in MIME format. --------------010403050509060707070108 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit
[email protected] 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--
