diff --git a/src/kvstore.c b/src/kvstore.c index eaef1fd35..a25f928ce 100644 --- a/src/kvstore.c +++ b/src/kvstore.c @@ -385,9 +385,10 @@ unsigned long long kvstoreScan(kvstore *kvs, unsigned long long cursor, */ int kvstoreExpand(kvstore *kvs, uint64_t newsize, int try_expand, kvstoreExpandShouldSkipDictIndex *skip_cb) { for (int i = 0; i < kvs->num_dicts; i++) { - dict *d = kvstoreGetDict(kvs, i); - if (!d || (skip_cb && skip_cb(i))) - continue; + if (skip_cb && skip_cb(i)) continue; + dict *d = createDictIfNeeded(kvs, i); + if (!d) continue; + int result = try_expand ? dictTryExpand(d, newsize) : dictExpand(d, newsize); if (try_expand && result == DICT_ERR) return 0; diff --git a/src/rdb.c b/src/rdb.c index 1d0a7e025..6e4506481 100644 --- a/src/rdb.c +++ b/src/rdb.c @@ -3902,6 +3902,8 @@ int rdbLoadRioWithLoadingCtx(rio *rdb, int rdbflags, rdbSaveInfo *rsi, rdbLoadin dbExpand(db, db_size, 0); dbExpandExpires(db, expires_size, 0); should_expand_db = 0; + serverLog(LL_VERBOSE, "DB %d resized: %lu key buckets, %lu expire buckets", + db->id, kvstoreBuckets(db->keys), kvstoreBuckets(db->expires)); } /* With metadata, type = RDB_OPCODE_KEY_META. Layout: [,],, */ diff --git a/tests/integration/rdb.tcl b/tests/integration/rdb.tcl index 1daebdec9..642a5d048 100644 --- a/tests/integration/rdb.tcl +++ b/tests/integration/rdb.tcl @@ -80,6 +80,23 @@ start_server [list overrides [list "dir" $server_path] keep_persistence true] { r del stream } +start_server {overrides {loglevel verbose}} { + test {RDB load applies RESIZEDB hint to expand hash tables} { + # Populate keys and save RDB + r flushall sync + regexp {db=(\d+)} [r client info] -> dbid + # 500 keys with 3600 second expiration, 500 without + populate 500 "key1:" 3 0 false 3600 + populate 500 "key2:" 3 0 false 0 + r save + + restart_server 0 true false + + # Verify DB resize log message + verify_log_message 0 "*DB $dbid resized*1024 key*512 expire*" 0 + } +} + # Helper function to start a server and kill it, just to check the error # logged. set defaults {}