svn commit: r190490 - head/lib/libc/db/hash

Xin LI delphij at FreeBSD.org
Fri Mar 27 23:25:34 PDT 2009


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,


More information about the svn-src-head mailing list