From 099203cb2a2bffe052231c7d15c5d6bb19951f00 Mon Sep 17 00:00:00 2001 From: Yuan Wang Date: Sat, 14 Feb 2026 15:18:08 +0800 Subject: [PATCH] Fix DB hash tables not expanding during RDB load (#14789) In standalone mode, we create dicts on demand. by default, there is no dicts, and RESIZEDB hint doesn't expand dict actually. so we should create dict first when expanding if the dict does not exist. --- src/kvstore.c | 7 ++++--- src/rdb.c | 2 ++ tests/integration/rdb.tcl | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) 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 {}