From: Remi Gacogne Date: Wed, 16 Feb 2022 16:15:00 +0000 (+0100) Subject: dnsdist: Schedule an immediate health-check for upgraded backends X-Git-Tag: rec-4.7.0-alpha1~9^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87adb9ffcce999f8b250b6a809f1e507ff3e0bb1;p=thirdparty%2Fpdns.git dnsdist: Schedule an immediate health-check for upgraded backends --- diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index 1e713fd297..f3c8ab0604 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -1830,11 +1830,12 @@ static void healthChecksThread() auto mplexer = std::unique_ptr(FDMultiplexer::getMultiplexerSilent()); auto states = g_dstates.getLocal(); // this points to the actual shared_ptrs! for(auto& dss : *states) { - if (++dss->lastCheck < dss->d_config.checkInterval) { + if (dss->d_nextCheck > 0) { + --dss->d_nextCheck; continue; } - dss->lastCheck = 0; + dss->d_nextCheck = dss->d_config.checkInterval; if (dss->d_config.availability == DownstreamState::Availability::Auto) { if (!queueHealthCheck(mplexer, dss)) { @@ -2587,6 +2588,7 @@ int main(int argc, char** argv) auto mplexer = std::unique_ptr(FDMultiplexer::getMultiplexerSilent()); for (auto& dss : g_dstates.getCopy()) { // it is a copy, but the internal shared_ptrs are the real deal if (dss->d_config.availability == DownstreamState::Availability::Auto) { + dss->d_nextCheck = dss->d_config.checkInterval; if (!queueHealthCheck(mplexer, dss, true)) { dss->setUpStatus(false); warnlog("Marking downstream %s as 'down'", dss->getNameWithAddr()); diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index 371e353048..e644fe36e7 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -804,7 +804,7 @@ public: size_t socketsOffset{0}; double latencyUsec{0.0}; double latencyUsecTCP{0.0}; - unsigned int lastCheck{0}; + unsigned int d_nextCheck{0}; uint8_t currentCheckFailures{0}; uint8_t consecutiveSuccessfulChecks{0}; std::atomic hashesComputed{false};