From 3e970746491a5a9e1a70804bb49e5527b4aaf17c Mon Sep 17 00:00:00 2001 From: Madelyn Olson <34459052+madolson@users.noreply.github.com> Date: Mon, 19 Apr 2021 22:16:27 -0700 Subject: [PATCH] Fix memory leak when doing lazyfreeing client tracking table (#8822) Interior rax pointers were not being freed (cherry picked from commit c73b4ddfd96d00ed0d0fde17953ce63d78bc3777) --- src/lazyfree.c | 5 ++--- src/server.h | 1 + tests/unit/tracking.tcl | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/lazyfree.c b/src/lazyfree.c index f18b2027f..a2cf2c3ed 100644 --- a/src/lazyfree.c +++ b/src/lazyfree.c @@ -39,12 +39,11 @@ void lazyfreeFreeSlotsMap(void *args[]) { atomicIncr(lazyfreed_objects,len); } -/* Release the rax mapping Redis Cluster keys to slots in the - * lazyfree thread. */ +/* Release the key tracking table. */ void lazyFreeTrackingTable(void *args[]) { rax *rt = args[0]; size_t len = rt->numele; - raxFree(rt); + freeTrackingRadixTree(rt); atomicDecr(lazyfree_objects,len); atomicIncr(lazyfreed_objects,len); } diff --git a/src/server.h b/src/server.h index d35eaa425..a2a722c6d 100644 --- a/src/server.h +++ b/src/server.h @@ -1911,6 +1911,7 @@ void disableTracking(client *c); void trackingRememberKeys(client *c); void trackingInvalidateKey(client *c, robj *keyobj); void trackingInvalidateKeysOnFlush(int async); +void freeTrackingRadixTree(rax *rt); void freeTrackingRadixTreeAsync(rax *rt); void trackingLimitUsedSlots(void); uint64_t trackingGetTotalItems(void); diff --git a/tests/unit/tracking.tcl b/tests/unit/tracking.tcl index 40f1a2a66..4c75b6f48 100644 --- a/tests/unit/tracking.tcl +++ b/tests/unit/tracking.tcl @@ -395,6 +395,17 @@ start_server {tags {"tracking network"}} { assert {[lindex msg 2] eq {} } } + test {Test ASYNC flushall} { + clean_all + r CLIENT TRACKING on REDIRECT $redir_id + r GET key1 + r GET key2 + assert_equal [s 0 tracking_total_keys] 2 + $rd_sg FLUSHALL ASYNC + assert_equal [s 0 tracking_total_keys] 0 + assert_equal [lindex [$rd_redirection read] 2] {} + } + # Keys are defined to be evicted 100 at a time by default. # If after eviction the number of keys still surpasses the limit # defined in tracking-table-max-keys, we increases eviction