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

Re: (ITS#7536) mdb assert when cleaning up accesslog



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

Fixed in the attached patch, please test.

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

--------------080809050807080004080107
Content-Type: text/x-patch;
 name="0001-ITS-7536-fix-mdb_rebalance.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="0001-ITS-7536-fix-mdb_rebalance.patch"

>From aee706272c660e052c991fea82ce6269c605be1d Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
Date: Wed, 6 Mar 2013 12:30:37 -0800
Subject: [PATCH] ITS#7536 fix mdb_rebalance

A page must always have at least 2 keys (unless it's a root page)
---
 libraries/liblmdb/mdb.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index 4d8bfa3..058c68b 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -6368,12 +6368,13 @@ mdb_rebalance(MDB_cursor *mc)
 	DPRINTF("found neighbor page %zu (%u keys, %.1f%% full)",
 	    mn.mc_pg[mn.mc_top]->mp_pgno, NUMKEYS(mn.mc_pg[mn.mc_top]), (float)PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) / 10);
 
-	/* If the neighbor page is above threshold and has at least two
-	 * keys, move one key from it.
+	/* If the neighbor page is above threshold and has at least three
+	 * keys, move one key from it. (A page must never have fewer than
+	 * 2 keys.)
 	 *
 	 * Otherwise we should try to merge them.
 	 */
-	if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) >= 2)
+	if (PAGEFILL(mc->mc_txn->mt_env, mn.mc_pg[mn.mc_top]) >= FILL_THRESHOLD && NUMKEYS(mn.mc_pg[mn.mc_top]) > 2)
 		return mdb_node_move(&mn, mc);
 	else {
 		if (mc->mc_ki[ptop] == 0)
-- 
1.7.2.5


--------------080809050807080004080107--