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:
parent
b115f257ba
commit
3130c353f8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=190490
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user