summaryrefslogtreecommitdiff
path: root/src/lazyfree.c
diff options
context:
space:
mode:
authorBinbin <binloveplay1314@qq.com>2021-05-30 22:56:04 +0800
committerGitHub <noreply@github.com>2021-05-30 17:56:04 +0300
commit01495c674a9b468734f778e29b5176572e73c9dd (patch)
treea54344b4ed40e6649cd6fe4e7fc880c054d7f6bc /src/lazyfree.c
parent58a03eca6705378ae8d29ffcc9d59794132acb14 (diff)
downloadredis-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.c25
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. */