summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvkalintiris <vasilis@netdata.cloud>2021-07-14 16:52:34 +0300
committerGitHub <noreply@github.com>2021-07-14 16:52:34 +0300
commit4006970974fc4e1187c3ea1e84af9b8c0d57dbf4 (patch)
tree7ade0e89d576f00fdd5bd947e291088493b2887b
parent41943d60f7f51f04ffbcefde27f9b44efcaefc6b (diff)
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.
-rw-r--r--database/engine/pagecache.c11
1 files 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
+}