svn commit: r190490 - head/lib/libc/db/hash
Xin LI
delphij at FreeBSD.org
Fri Mar 27 23:25:33 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-all
mailing list