• Yanqi Lv's avatar
    Change the threshold of dict expand, shrink and rehash (#12948) · b07174af
    Yanqi Lv authored
    Before this change (most recently modified in
    https://github.com/redis/redis/pull/12850#discussion_r1421406393), The
    trigger for normal expand threshold was 100% utilization and the trigger
    for normal shrink threshold was 10% (HASHTABLE_MIN_FILL).
    While during fork (DICT_RESIZE_AVOID), when we want to avoid rehash, the
    trigger thresholds were multiplied by 5 (`dict_force_resize_ratio`),
    meaning 500% for expand and 2% (100/10/5) for shrink.
    
    However, in `dictRehash` (the incremental rehashing), the rehashing
    threshold for shrinking during fork (DICT_RESIZE_AVOID) was 20% by
    mistake.
    This meant that if a shrinking is triggered when `dict_can_resize` is
    `DICT_RESIZE_ENABLE` which the threshold is 10%, the rehashing can
    continue when `dict_can_resize` is `DICT_RESIZE_AVOID`.
    This would cause unwanted CopyOnWrite damage.
    
    It'll make sense to change the thresholds of the rehash trigger and the
    thresholds of the incremental rehashing the same, however, in one we
    compare the size of the hash table to the number of records, and in the
    other we compare the size of ht[0] to the size of ht[1], so the formula
    is not exactly the same.
    
    to make things easier we change all the thresholds to powers of 2, so
    the normal shrinking threshold is changed from 100/10 (i.e. 10%) to
    100/8 (i.e. 12.5%), and we change the threshold during forks from 5 to
    4, i.e. from 500% to 400% for expand, and from 2% (100/10/5) to 3.125%
    (100/8/4)
    b07174af
other.tcl 14.9 KB