[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#7623) P_SUBP page inn MDB dirty_list



This is a multi-part message in MIME format.
--------------010507020109080701050704
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hallvard Breien Furuseth wrote:
> Howard Chu writes:
>> The flag is being propagated when the page grows and turns into a real page.
>> Fixed by this simple patch.
>> (...)
>>   				mp->mp_flags = fp->mp_flags | P_DIRTY;
>> +				mp->mp_flags &= ~(P_SUBP|P_FAKE);
>>   				mp->mp_pad   = fp->mp_pad;
>
> This fixes test043, but breaks test046-dds: ldapexop exits with 49
> (invalidCredentials) for "Refreshing the meeting as $BJORNSDN...".
> It passes without the patch.  This is RE24 (4dc62839c2324b46bfd6)
> or RE24 + mdb.master (60086c1bc77fafecef27).

Try this instead. Currently testing it on my PC.

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/

--------------010507020109080701050704
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..33642c8 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -5190,6 +5190,7 @@ more:
 				MDB_page *mp;
 				unsigned int offset;
 				unsigned int i;
+				uint16_t fp_flags;
 
 				fp = NODEDATA(leaf);
 				if (flags == MDB_CURRENT) {
@@ -5209,6 +5210,7 @@ reuse:
 					offset = NODESIZE + sizeof(indx_t) + data->mv_size;
 				}
 				offset += offset & 1;
+				fp_flags = fp->mp_flags;
 				if (NODESIZE + sizeof(indx_t) + NODEKSZ(leaf) + NODEDSZ(leaf) +
 					offset >= mc->mc_txn->mt_env->me_nodemax) {
 					/* yes, convert it */
@@ -5232,6 +5234,7 @@ reuse:
 					offset = mc->mc_txn->mt_env->me_psize - NODEDSZ(leaf);
 					flags |= F_DUPDATA|F_SUBDATA;
 					dummy.md_root = mp->mp_pgno;
+					fp_flags &= ~(P_SUBP|P_FAKE);
 				} else {
 					/* no, just grow it */
 					rdata = &xdata;
@@ -5241,7 +5244,7 @@ reuse:
 					mp->mp_pgno = mc->mc_pg[mc->mc_top]->mp_pgno;
 					flags |= F_DUPDATA;
 				}
-				mp->mp_flags = fp->mp_flags | P_DIRTY;
+				mp->mp_flags = fp_flags | P_DIRTY;
 				mp->mp_pad   = fp->mp_pad;
 				mp->mp_lower = fp->mp_lower;
 				mp->mp_upper = fp->mp_upper + offset;

--------------010507020109080701050704--