Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Mar 2009 06:38:32 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r190492 - head/lib/libc/db/hash
Message-ID:  <200903280638.n2S6cWhu087234@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Sat Mar 28 06:38:31 2009
New Revision: 190492
URL: http://svn.freebsd.org/changeset/base/190492

Log:
   - Avoid overwriting the cursor page when the cursor page becomes the
  LRU page.
   - Fix for sequential retrieval failure when using large key/data pairs.
  
  Obtained from:	OpenBSD

Modified:
  head/lib/libc/db/hash/hash_buf.c

Modified: head/lib/libc/db/hash/hash_buf.c
==============================================================================
--- head/lib/libc/db/hash/hash_buf.c	Sat Mar 28 06:30:43 2009	(r190491)
+++ head/lib/libc/db/hash/hash_buf.c	Sat Mar 28 06:38:31 2009	(r190492)
@@ -164,11 +164,31 @@ newbuf(HTAB *hashp, u_int32_t addr, BUFH
 
 	oaddr = 0;
 	bp = LRU;
+
+        /* It is bad to overwrite the page under the cursor. */
+        if (bp == hashp->cpage) {
+                BUF_REMOVE(bp);
+                MRU_INSERT(bp);
+                bp = LRU;
+        }
+
+	/* If prev_bp is part of bp overflow, create a new buffer. */
+	if (hashp->nbufs == 0 && prev_bp && bp->ovfl) {
+		BUFHEAD *ovfl;
+
+		for (ovfl = bp->ovfl; ovfl ; ovfl = ovfl->ovfl) {
+			if (ovfl == prev_bp) {
+				hashp->nbufs++;
+				break;
+			}
+		}
+	}
+
 	/*
 	 * If LRU buffer is pinned, the buffer pool is too small. We need to
 	 * allocate more buffers.
 	 */
-	if (hashp->nbufs || (bp->flags & BUF_PIN)) {
+	if (hashp->nbufs || (bp->flags & BUF_PIN) || bp == hashp->cpage) {
 		/* Allocate a new one */
 		if ((bp = (BUFHEAD *)calloc(1, sizeof(BUFHEAD))) == NULL)
 			return (NULL);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903280638.n2S6cWhu087234>