diff options
author | Binbin <binloveplay1314@qq.com> | 2021-05-30 22:56:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-30 17:56:04 +0300 |
commit | 01495c674a9b468734f778e29b5176572e73c9dd (patch) | |
tree | a54344b4ed40e6649cd6fe4e7fc880c054d7f6bc /src/lazyfree.c | |
parent | 58a03eca6705378ae8d29ffcc9d59794132acb14 (diff) | |
download | redis-01495c674a9b468734f778e29b5176572e73c9dd.tar.gz |
Extend freeSlotsToKeysMapAsync and freeTrackingRadixTreeAsync to check LAZYFREE_THRESHOLD. (#8969)
Without this fix, FLUSHALL ASYNC would have freed these in a background thread,
even if they didn't contain many elements (unlike how it works with other structures), which could be inefficient.
Diffstat (limited to 'src/lazyfree.c')
-rw-r--r-- | src/lazyfree.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/lazyfree.c b/src/lazyfree.c index db48f83fa..bb966e7f5 100644 --- a/src/lazyfree.c +++ b/src/lazyfree.c @@ -48,6 +48,7 @@ void lazyFreeTrackingTable(void *args[]) { atomicIncr(lazyfreed_objects,len); } +/* Release the lua_scripts dict. */ void lazyFreeLuaScripts(void *args[]) { dict *lua_scripts = args[0]; long long len = dictSize(lua_scripts); @@ -212,16 +213,28 @@ void emptyDbAsync(redisDb *db) { bioCreateLazyFreeJob(lazyfreeFreeDatabase,2,oldht1,oldht2); } -/* Release the radix tree mapping Redis Cluster keys to slots asynchronously. */ +/* Release the radix tree mapping Redis Cluster keys to slots. + * If the rax is huge enough, free it in async way. */ void freeSlotsToKeysMapAsync(rax *rt) { - atomicIncr(lazyfree_objects,rt->numele); - bioCreateLazyFreeJob(lazyfreeFreeSlotsMap,1,rt); + /* Because this rax has only keys and no values so we use numnodes. */ + if (rt->numnodes > LAZYFREE_THRESHOLD) { + atomicIncr(lazyfree_objects,rt->numele); + bioCreateLazyFreeJob(lazyfreeFreeSlotsMap,1,rt); + } else { + raxFree(rt); + } } -/* Free an object, if the object is huge enough, free it in async way. */ +/* Free the key tracking table. + * If the table is huge enough, free it in async way. */ void freeTrackingRadixTreeAsync(rax *tracking) { - atomicIncr(lazyfree_objects,tracking->numele); - bioCreateLazyFreeJob(lazyFreeTrackingTable,1,tracking); + /* Because this rax has only keys and no values so we use numnodes. */ + if (tracking->numnodes > LAZYFREE_THRESHOLD) { + atomicIncr(lazyfree_objects,tracking->numele); + bioCreateLazyFreeJob(lazyFreeTrackingTable,1,tracking); + } else { + freeTrackingRadixTree(tracking); + } } /* Free lua_scripts dict, if the dict is huge enough, free it in async way. */ |