]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Dnsdist: Reset latency of an upstream server when it is marked down 10508/head
authorHolger Hoffstätte <holger@applied-asynchrony.com>
Sat, 26 Jun 2021 16:16:42 +0000 (18:16 +0200)
committerHolger Hoffstätte <holger@applied-asynchrony.com>
Sat, 26 Jun 2021 16:16:42 +0000 (18:16 +0200)
pdns/dnsdist-lua-bindings.cc
pdns/dnsdist.cc
pdns/dnsdist.hh
pdns/dnsdistdist/dnsdist-healthchecks.cc

index 1a1ace93d7d0a19545bf7e27efa023575e1db778..f8c04b8d0e9c87359842ad7a338bca635c1f534a 100644 (file)
@@ -111,7 +111,7 @@ void setupLuaBindings(LuaContext& luaCtx, bool client)
   luaCtx.registerFunction("setUp", &DownstreamState::setUp);
   luaCtx.registerFunction<void(DownstreamState::*)(boost::optional<bool> newStatus)>("setAuto", [](DownstreamState& s, boost::optional<bool> newStatus) {
       if (newStatus) {
-        s.upStatus = *newStatus;
+        s.setUpStatus(*newStatus);
       }
       s.setAuto();
     });
index 9a2ac0a23f228aa879a236a9653edc13e68e4eb4..3a0b2c20dbf52ed693564a3fcdb54258ef4eadcf 100644 (file)
@@ -2413,7 +2413,7 @@ int main(int argc, char** argv)
     for(auto& dss : g_dstates.getCopy()) { // it is a copy, but the internal shared_ptrs are the real deal
       if (dss->availability == DownstreamState::Availability::Auto) {
         if (!queueHealthCheck(mplexer, dss, true)) {
-          dss->upStatus = false;
+          dss->setUpStatus(false);
           warnlog("Marking downstream %s as 'down'", dss->getNameWithAddr());
         }
       }
index 5d6ed9401a321e96da194d96d6f21bd97e057792..cd2328e64448cfd4dbaa9002ad18ab5c5ddc884d 100644 (file)
@@ -988,7 +988,17 @@ struct DownstreamState
     return upStatus;
   }
   void setUp() { availability = Availability::Up; }
-  void setDown() { availability = Availability::Down; }
+  void setUpStatus(bool newStatus)
+  {
+    upStatus = newStatus;
+    if (!upStatus)
+      latencyUsec = 0.0;
+  }
+  void setDown()
+  {
+    availability = Availability::Down;
+    latencyUsec = 0.0;
+  }
   void setAuto() { availability = Availability::Auto; }
   const string& getName() const {
     return name;
index ac013d2c02d3c916fe8857bd0fd218ac8fad40b9..4b1dd9057e456424c7ff5be190056c352c5d29de 100644 (file)
@@ -68,7 +68,7 @@ void updateHealthCheckResult(const std::shared_ptr<DownstreamState>& dss, bool n
       }
     }
 
-    dss->upStatus = newState;
+    dss->setUpStatus(newState);
     dss->currentCheckFailures = 0;
     dss->consecutiveSuccessfulChecks = 0;
     if (g_snmpAgent && g_snmpTrapsEnabled) {
@@ -172,7 +172,7 @@ static void initialHealthCheckCallback(int fd, FDMultiplexer::funcparam_t& param
   data->d_mplexer->removeReadFD(fd);
   bool up = handleResponse(data);
   warnlog("Marking downstream %s as '%s'", data->d_ds->getNameWithAddr(), up ? "up" : "down");
-  data->d_ds->upStatus = up;
+  data->d_ds->setUpStatus(up);
 }
 
 bool queueHealthCheck(std::shared_ptr<FDMultiplexer>& mplexer, const std::shared_ptr<DownstreamState>& ds, bool initialCheck)
@@ -284,7 +284,7 @@ void handleQueuedHealthChecks(std::shared_ptr<FDMultiplexer>& mplexer, bool init
       }
       if (initial) {
         warnlog("Marking downstream %s as 'down'", data->d_ds->getNameWithAddr());
-        data->d_ds->upStatus = false;
+        data->d_ds->setUpStatus(false);
       }
       else {
         updateHealthCheckResult(data->d_ds, false);