Author: delphij
Date: Sat Mar 28 06:25:33 2009
New Revision: 190490
URL: http://svn.freebsd.org/changeset/base/190490

Log:
  Only squeeze a short key/value pair onto a page with other complete key/value
  pairs, not onto a page containing the end of a big pair.
  
  Obtained from:        NetBSD via OpenBSD

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

Modified: head/lib/libc/db/hash/hash_page.c
==============================================================================
--- head/lib/libc/db/hash/hash_page.c   Sat Mar 28 06:23:10 2009        
(r190489)
+++ head/lib/libc/db/hash/hash_page.c   Sat Mar 28 06:25:33 2009        
(r190490)
@@ -404,17 +404,22 @@ __addel(HTAB *hashp, BUFHEAD *bufp, cons
                        if (!bufp)
                                return (-1);
                        bp = (u_int16_t *)bufp->page;
-               } else
+               } else if (bp[bp[0]] != OVFLPAGE) {
+                       /* Short key/data pairs, no more pages */
+                       break;
+               } else {
                        /* Try to squeeze key on this page */
-                       if (FREESPACE(bp) > PAIRSIZE(key, val)) {
+                       if (bp[2] >= REAL_KEY &&
+                           FREESPACE(bp) >= PAIRSIZE(key, val)) {
                                squeeze_key(bp, key, val);
-                               return (0);
+                               goto stats;
                        } else {
                                bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
                                if (!bufp)
                                        return (-1);
                                bp = (u_int16_t *)bufp->page;
                        }
+               }
 
        if (PAIRFITS(bp, key, val))
                putpair(bufp->page, key, val);
@@ -431,6 +436,7 @@ __addel(HTAB *hashp, BUFHEAD *bufp, cons
                        if (__big_insert(hashp, bufp, key, val))
                                return (-1);
        }
+stats:
        bufp->flags |= BUF_MOD;
        /*
         * If the average number of keys per bucket exceeds the fill factor,
_______________________________________________
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