Unverified Commit 464aa041 authored by zhaozhao.zz's avatar zhaozhao.zz Committed by GitHub
Browse files

fix infinite sleep in performEvictions when have lazyfree jobs (#11237)

This bug is introduced in #7653. (Redis 6.2.0)

When `server.maxmemory_eviction_tenacity` is 100, `eviction_time_limit_us` is
`ULONG_MAX`, and if we cannot find the best key to delete (e.g. maxmemory-policy
is `volatile-lru` and all keys with ttl have been evicted), in `cant_free` redis will sleep
forever if some items are being freed in the lazyfree thread.
parent d144dc92
...@@ -595,7 +595,7 @@ int performEvictions(void) { ...@@ -595,7 +595,7 @@ int performEvictions(void) {
{ {
struct evictionPoolEntry *pool = EvictionPoolLRU; struct evictionPoolEntry *pool = EvictionPoolLRU;
while(bestkey == NULL) { while (bestkey == NULL) {
unsigned long total_keys = 0, keys; unsigned long total_keys = 0, keys;
/* We don't want to make local-db choices when expiring keys, /* We don't want to make local-db choices when expiring keys,
...@@ -738,12 +738,18 @@ cant_free: ...@@ -738,12 +738,18 @@ cant_free:
/* At this point, we have run out of evictable items. It's possible /* At this point, we have run out of evictable items. It's possible
* that some items are being freed in the lazyfree thread. Perform a * that some items are being freed in the lazyfree thread. Perform a
* short wait here if such jobs exist, but don't wait long. */ * short wait here if such jobs exist, but don't wait long. */
if (bioPendingJobsOfType(BIO_LAZY_FREE)) { mstime_t lazyfree_latency;
usleep(eviction_time_limit_us); latencyStartMonitor(lazyfree_latency);
while (bioPendingJobsOfType(BIO_LAZY_FREE) &&
elapsedUs(evictionTimer) < eviction_time_limit_us) {
if (getMaxmemoryState(NULL,NULL,NULL,NULL) == C_OK) { if (getMaxmemoryState(NULL,NULL,NULL,NULL) == C_OK) {
result = EVICT_OK; result = EVICT_OK;
break;
} }
usleep(eviction_time_limit_us < 1000 ? eviction_time_limit_us : 1000);
} }
latencyEndMonitor(lazyfree_latency);
latencyAddSampleIfNeeded("eviction-lazyfree",lazyfree_latency);
} }
serverAssert(server.core_propagates); /* This function should not be re-entrant */ serverAssert(server.core_propagates); /* This function should not be re-entrant */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment