From 571718f774142e095be8caf24da3cc6efb22ad84 Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 7 Apr 2021 17:41:20 +0000 Subject: [PATCH] Avoid posting unnecessary async tasks Former-commit-id: 08f63fdfd6c78388bba093ec2edda7d77fc9173e --- src/gc.h | 8 +++++++- src/server.cpp | 16 +++++++++------- src/server.h | 5 +++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/gc.h b/src/gc.h index 5d92e38cb..8ed834ae9 100644 --- a/src/gc.h +++ b/src/gc.h @@ -49,6 +49,12 @@ public: m_setepochOutstanding.clear(); } + bool empty() const + { + std::unique_lock lock(m_lock); + return m_vecepochs.empty(); + } + void endEpoch(uint64_t epoch, bool fNoFree = false) { std::unique_lock lock(m_lock); @@ -109,7 +115,7 @@ public: } private: - fastlock m_lock { "Garbage Collector"}; + mutable fastlock m_lock { "Garbage Collector"}; std::vector m_vecepochs; std::unordered_set m_setepochOutstanding; diff --git a/src/server.cpp b/src/server.cpp index 71d2a5ed4..a323053f9 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2441,13 +2441,15 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { ProcessPendingAsyncWrites(); run_with_period(10) { - // Server threads don't free the GC, but if we don't have a - // a bgsave or some other async task then we'll hold onto the - // data for too long - g_pserver->asyncworkqueue->AddWorkFunction([]{ - auto epoch = g_pserver->garbageCollector.startEpoch(); - g_pserver->garbageCollector.endEpoch(epoch); - }); + if (!g_pserver->garbageCollector.empty()) { + // Server threads don't free the GC, but if we don't have a + // a bgsave or some other async task then we'll hold onto the + // data for too long + g_pserver->asyncworkqueue->AddWorkFunction([]{ + auto epoch = g_pserver->garbageCollector.startEpoch(); + g_pserver->garbageCollector.endEpoch(epoch); + }); + } } g_pserver->cronloops++; diff --git a/src/server.h b/src/server.h index 2f95f02bc..0e8bf8ccb 100644 --- a/src/server.h +++ b/src/server.h @@ -1852,6 +1852,11 @@ public: garbageCollectorGeneric.endEpoch(epochGeneric, fNoFree); } + bool empty() + { + return garbageCollectorGeneric.empty() && garbageCollectorSnapshot.empty(); + } + void shutdown() { garbageCollectorSnapshot.shutdown();