• Binbin's avatar
    Fix rehashingStarted miscalculating bucket_count in dict initialization (#12846) · e6423b7a
    Binbin authored
    In the old dictRehashingInfo implementation, for the initialization
    scenario,
    it mistakenly directly set to_size to DICTHT_SIZE(DICT_HT_INITIAL_EXP),
    which
    is 4 in our code by default.
    
    In scenarios where dictExpand directly passes the target size as
    initialization,
    the code will calculate bucket_count incorrectly. For example, in DEBUG
    POPULATE
    or RDB load scenarios, it will cause the final bucket_count to be
    initialized to
    65536 (16384 * 4), see:
    ```
    before:
    DB 0: 10000000 keys (0 volatile) in 65536 slots HT.
    
    it should be:
    DB 0: 10000000 keys (0 volatile) in 16777216 slots HT.
    ```
    
    In PR, new ht will also be initialized before calling rehashingStarted
    in
    _dictExpand, so that the calls in dictRehashingInfo can be unified.
    
    Bug was introduced in #12697.
    e6423b7a
dict.c 61.8 KB