]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Schedule an immediate health-check for upgraded backends
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 16 Feb 2022 16:15:00 +0000 (17:15 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 22 Feb 2022 10:32:22 +0000 (11:32 +0100)
pdns/dnsdist.cc
pdns/dnsdist.hh

index 1e713fd297d222dc4f6796818ab00b88e63f2159..f3c8ab06041059248f9f6a9bc6c0f499805a8dd1 100644 (file)
@@ -1830,11 +1830,12 @@ static void healthChecksThread()
     auto mplexer = std::unique_ptr<FDMultiplexer>(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>(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());
index 371e353048c21f2096c9b2dd232cc76bb875797c..e644fe36e719e9582dad20f96ae803bae51cada7 100644 (file)
@@ -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<bool> hashesComputed{false};