From 3f1f22d6b4c7a1e8f98ccf34b2611f95a9acd5a7 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 13 Jan 2026 16:25:10 +0100 Subject: [PATCH] dnsdist: Do not keep stale cache entries around for empty pools Signed-off-by: Remi Gacogne --- pdns/dnsdistdist/dnsdist-backend.cc | 5 +++++ pdns/dnsdistdist/dnsdist-server-pool.hh | 1 + pdns/dnsdistdist/dnsdist.cc | 2 +- pdns/dnsdistdist/test-dnsdistserverpool.cc | 4 ++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pdns/dnsdistdist/dnsdist-backend.cc b/pdns/dnsdistdist/dnsdist-backend.cc index 112655401c..a755f5be41 100644 --- a/pdns/dnsdistdist/dnsdist-backend.cc +++ b/pdns/dnsdistdist/dnsdist-backend.cc @@ -1152,6 +1152,11 @@ void ServerPool::setECS(bool useECS) updateConsistency(); } +bool ServerPool::shouldKeepStaleData() const +{ + return !getServers().empty() && countServers(true) == 0; +} + namespace dnsdist::backend { void registerNewBackend(std::shared_ptr& backend) diff --git a/pdns/dnsdistdist/dnsdist-server-pool.hh b/pdns/dnsdistdist/dnsdist-server-pool.hh index 78ba591aa9..9aa6d533fe 100644 --- a/pdns/dnsdistdist/dnsdist-server-pool.hh +++ b/pdns/dnsdistdist/dnsdist-server-pool.hh @@ -64,6 +64,7 @@ struct ServerPool size_t poolLoad() const; size_t countServers(bool upOnly) const; bool hasAtLeastOneServerAvailable() const; + bool shouldKeepStaleData() const; const ServerPolicy::NumberedServerVector& getServers() const; void addServer(std::shared_ptr& server); void removeServer(std::shared_ptr& server); diff --git a/pdns/dnsdistdist/dnsdist.cc b/pdns/dnsdistdist/dnsdist.cc index a4bebd84e4..200f4d3d4b 100644 --- a/pdns/dnsdistdist/dnsdist.cc +++ b/pdns/dnsdistdist/dnsdist.cc @@ -2426,7 +2426,7 @@ static void maintThread() has all its backends down) */ if (packetCache->keepStaleData() && !iter->second) { /* so far all pools had at least one backend up */ - if (pool.countServers(true) == 0) { + if (pool.shouldKeepStaleData()) { iter->second = true; } } diff --git a/pdns/dnsdistdist/test-dnsdistserverpool.cc b/pdns/dnsdistdist/test-dnsdistserverpool.cc index f9370adacf..d15a43aa77 100644 --- a/pdns/dnsdistdist/test-dnsdistserverpool.cc +++ b/pdns/dnsdistdist/test-dnsdistserverpool.cc @@ -59,6 +59,7 @@ BOOST_AUTO_TEST_CASE(test_ServerPoolBasics) BOOST_CHECK_EQUAL(pool.countServers(true), 0U); BOOST_CHECK_EQUAL(pool.countServers(false), 0U); BOOST_CHECK_EQUAL(pool.poolLoad(), 0U); + BOOST_CHECK(!pool.shouldKeepStaleData()); { const auto& servers = pool.getServers(); @@ -76,6 +77,7 @@ BOOST_AUTO_TEST_CASE(test_ServerPoolBasics) BOOST_CHECK(!pool.hasAtLeastOneServerAvailable()); BOOST_CHECK_EQUAL(pool.countServers(true), 0U); BOOST_CHECK_EQUAL(pool.countServers(false), 1U); + BOOST_CHECK(pool.shouldKeepStaleData()); BOOST_CHECK_EQUAL(pool.poolLoad(), 0U); { @@ -88,11 +90,13 @@ BOOST_AUTO_TEST_CASE(test_ServerPoolBasics) BOOST_CHECK(pool.hasAtLeastOneServerAvailable()); BOOST_CHECK_EQUAL(pool.countServers(true), 1U); BOOST_CHECK_EQUAL(pool.countServers(false), 1U); + BOOST_CHECK(!pool.shouldKeepStaleData()); /* now remove it */ pool.removeServer(ds); BOOST_CHECK_EQUAL(pool.countServers(true), 0U); BOOST_CHECK_EQUAL(pool.countServers(false), 0U); + BOOST_CHECK(!pool.shouldKeepStaleData()); { const auto& servers = pool.getServers(); BOOST_CHECK(servers.empty()); -- 2.47.3