svn commit: r190492 - head/lib/libc/db/hash
Xin LI
delphij at FreeBSD.org
Fri Mar 27 23:38:32 PDT 2009
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);
More information about the svn-src-head
mailing list