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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to