From 4006970974fc4e1187c3ea1e84af9b8c0d57dbf4 Mon Sep 17 00:00:00 2001 From: vkalintiris Date: Wed, 14 Jul 2021 16:52:34 +0300 Subject: Log message when page cache sleeps for more than 1 second. (#11314) If the page cache manager can not reserve the requested number of pages, it sleeps based on an exponential-backoff value. Normally, this value is a couple milliseconds. However, in rare cases the sleep duration can grow up to several seconds. This patch logs an error message whenever the sleep period is more than 1 second. --- database/engine/pagecache.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/database/engine/pagecache.c b/database/engine/pagecache.c index f17afc22ba..90423176c0 100644 --- a/database/engine/pagecache.c +++ b/database/engine/pagecache.c @@ -299,10 +299,15 @@ static void pg_cache_reserve_pages(struct rrdengine_instance *ctx, unsigned numb destroy_completion(&compl); if (unlikely(failures > 1)) { - unsigned long slots; + unsigned long slots, usecs_to_sleep; /* exponential backoff */ slots = random() % (2LU << MIN(failures, FAILURES_CEILING)); - (void)sleep_usec(slots * exp_backoff_slot_usec); + usecs_to_sleep = slots * exp_backoff_slot_usec; + + if (usecs_to_sleep >= USEC_PER_SEC) + error("Page cache is full. Sleeping for %llu second(s).", usecs_to_sleep / USEC_PER_SEC); + + (void)sleep_usec(usecs_to_sleep); } uv_rwlock_wrlock(&pg_cache->pg_cache_rwlock); } @@ -1243,4 +1248,4 @@ void free_page_cache(struct rrdengine_instance *ctx) bytes_freed += ret_Judy; info("Freed %lu bytes of memory from page cache.", bytes_freed); -} \ No newline at end of file +} -- cgit v1.2.3