From fc29fd83894d0d72f1384b880dd2fdc31af98df5 Mon Sep 17 00:00:00 2001 From: guybe7 Date: Tue, 13 Oct 2020 18:50:57 +0200 Subject: [PATCH] performEvictions: mem_freed may be negative (#7908) If 'delta' is negative 'mem_freed' may underflow and cause the while loop to exit prematurely (And not evicting enough memory) mem_freed can be negative when: 1. We use lazy free (consuming memory by appending to a list) 2. Thread doing an allocation between the two calls to zmalloc_used_memory. --- src/evict.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/evict.c b/src/evict.c index 0e8f818ff..d14603aef 100644 --- a/src/evict.c +++ b/src/evict.c @@ -499,7 +499,8 @@ int performEvictions(void) { if (!isSafeToPerformEvictions()) return EVICT_OK; int keys_freed = 0; - size_t mem_reported, mem_tofree, mem_freed; + size_t mem_reported, mem_tofree; + long long mem_freed; /* May be negative */ mstime_t latency, eviction_latency; long long delta; int slaves = listLength(server.slaves); @@ -520,7 +521,7 @@ int performEvictions(void) { monotime evictionTimer; elapsedStart(&evictionTimer); - while (mem_freed < mem_tofree) { + while (mem_freed < (long long)mem_tofree) { int j, k, i; static unsigned int next_db = 0; sds bestkey = NULL;