From f67e820847381f47cbaf742eb4f3c81ad2511fa6 Mon Sep 17 00:00:00 2001 From: scott Date: Sat, 29 May 2021 17:54:57 +0800 Subject: [PATCH] fix coredump when slot dict do expand after defrag --- extern/redis-4.0.1/src/defrag.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/extern/redis-4.0.1/src/defrag.c b/extern/redis-4.0.1/src/defrag.c index 4a1dcefe4..4528dd356 100644 --- a/extern/redis-4.0.1/src/defrag.c +++ b/extern/redis-4.0.1/src/defrag.c @@ -285,6 +285,18 @@ int defragKey(redisDb *db, dictEntry *de) { newsds = activeDefragSds(keysds); if (newsds) defragged++, de->key = newsds; + + /* 对slot对应的dict进行内存碎片整理,并且使用新的key地址替换老的key地址 + * 这里没有对hashtag对应的zset数据结构进行内存整理,向zset数据结构中添加key时,对key做了dup处理,key指针是有效的 + */ + do { + uint32_t crc; + int hastag; + int slot = slots_num(de->key, &crc, &hastag); + unsigned int hash = dictGetHash(db->hash_slots[slot], de->key); + replaceSateliteDictKeyPtrAndOrDefragDictEntry(db->hash_slots[slot], keysds, newsds, hash, &defragged); + } while (0); + if (dictSize(db->expires)) { /* Dirty code: * I can't search in db->expires for that key after i already released