1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-20 11:11:24 +00:00

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
This commit is contained in:
Xin LI 2009-03-28 06:25:33 +00:00
parent b115f257ba
commit 3130c353f8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=190490

View File

@ -404,17 +404,22 @@ __addel(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT *val)
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, const DBT *key, const DBT *val)
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,