Don't let dictionaries shrink too rapidly. It can cause massive perf issues while in the shrink rehash
Former-commit-id: a7ad346e4f03c85d22a29c8268d35471e86283aa
This commit is contained in:
parent
76698beeaf
commit
4066ce8f3a
@ -1267,6 +1267,7 @@ unsigned long dictScan(dict *d,
|
|||||||
/* Expand the hash table if needed */
|
/* Expand the hash table if needed */
|
||||||
static int _dictExpandIfNeeded(dict *d)
|
static int _dictExpandIfNeeded(dict *d)
|
||||||
{
|
{
|
||||||
|
static const size_t SHRINK_FACTOR = 4;
|
||||||
/* Incremental rehashing already in progress. Return. */
|
/* Incremental rehashing already in progress. Return. */
|
||||||
if (dictIsRehashing(d)) return DICT_OK;
|
if (dictIsRehashing(d)) return DICT_OK;
|
||||||
|
|
||||||
@ -1283,10 +1284,10 @@ static int _dictExpandIfNeeded(dict *d)
|
|||||||
{
|
{
|
||||||
return dictExpand(d, d->ht[0].used*2, false /*fShrink*/);
|
return dictExpand(d, d->ht[0].used*2, false /*fShrink*/);
|
||||||
}
|
}
|
||||||
else if (d->ht[0].used > 0 && d->ht[0].used * 16 < d->ht[0].size && dict_can_resize)
|
else if (d->ht[0].used > 0 && d->ht[0].size >= (1024*SHRINK_FACTOR) && (d->ht[0].used * 16) < d->ht[0].size && dict_can_resize)
|
||||||
{
|
{
|
||||||
// If the dictionary has shurnk a lot we'll need to shrink the hash table instead
|
// If the dictionary has shurnk a lot we'll need to shrink the hash table instead
|
||||||
return dictExpand(d, d->ht[0].used*2, true /*fShrink*/);
|
return dictExpand(d, d->ht[0].size/SHRINK_FACTOR, true /*fShrink*/);
|
||||||
}
|
}
|
||||||
return DICT_OK;
|
return DICT_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user