]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add unreachable servers, connect when they are up
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 3 Aug 2016 09:07:10 +0000 (11:07 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 16 Aug 2016 07:37:29 +0000 (09:37 +0200)
pdns/dnsdist-lua.cc
pdns/dnsdist.cc
pdns/dnsdist.hh

index 8e122046cfdaf74c7c7be3387188406a5f40a84a..53e5b43e251a3ac0142c8c4a1970b9e9bd0c5d3e 100644 (file)
@@ -226,13 +226,15 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
                          addServerToPool(localPools, "", ret);
                          g_pools.setState(localPools);
 
-                         if(g_launchWork) {
-                           g_launchWork->push_back([ret]() {
-                               ret->tid = move(thread(responderThread, ret));
+                         if (ret->connected) {
+                           if(g_launchWork) {
+                             g_launchWork->push_back([ret]() {
+                               ret->tid = move(thread(responderThread, ret));
                              });
-                         }
-                         else {
-                           ret->tid = move(thread(responderThread, ret));
+                           }
+                           else {
+                             ret->tid = move(thread(responderThread, ret));
+                           }
                          }
 
                          return ret;
@@ -372,13 +374,15 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
                          ret->maxCheckFailures=std::stoi(boost::get<string>(vars["maxCheckFailures"]));
                        }
 
-                       if(g_launchWork) {
-                         g_launchWork->push_back([ret]() {
+                       if (ret->connected) {
+                         if(g_launchWork) {
+                           g_launchWork->push_back([ret]() {
                              ret->tid = move(thread(responderThread, ret));
                            });
-                       }
-                       else {
-                         ret->tid = move(thread(responderThread, ret));
+                         }
+                         else {
+                           ret->tid = move(thread(responderThread, ret));
+                         }
                        }
 
                        auto states = g_dstates.getCopy();
index dbefaa85991404aa0893b3a8080f1f18cd3b9623..150028ce079dbf5c6cbd6f745a330de576978f30 100644 (file)
@@ -472,7 +472,13 @@ DownstreamState::DownstreamState(const ComboAddress& remote_, const ComboAddress
       SSetsockopt(fd, SOL_SOCKET, SO_REUSEADDR, 1);
       SBind(fd, sourceAddr);
     }
-    SConnect(fd, remote);
+    try {
+      SConnect(fd, remote);
+      connected = true;
+    }
+    catch(const std::runtime_error& error) {
+      infolog("Error connecting to new server with address %s: %s", remote.toStringWithPort(), error.what());
+    }
     idStates.resize(g_maxOutstanding);
     sw.start();
     infolog("Added downstream server %s", remote.toStringWithPort());
@@ -1271,6 +1277,18 @@ void* healthChecksThread()
 
         if(newState != dss->upStatus) {
           warnlog("Marking downstream %s as '%s'", dss->getNameWithAddr(), newState ? "up" : "down");
+
+          if (newState && !dss->connected) {
+            try {
+              SConnect(dss->fd, dss->remote);
+              dss->connected = true;
+              dss->tid = move(thread(responderThread, dss));
+            }
+            catch(const std::runtime_error& error) {
+              infolog("Error connecting to new server with address %s: %s", dss->remote.toStringWithPort(), error.what());
+            }
+          }
+
           dss->upStatus = newState;
           dss->currentCheckFailures = 0;
         }
@@ -1871,7 +1889,9 @@ try
     for(const auto& address : g_cmdLine.remotes) {
       auto ret=std::make_shared<DownstreamState>(ComboAddress(address, 53));
       addServerToPool(localPools, "", ret);
-      ret->tid = move(thread(responderThread, ret));
+      if (ret->connected) {
+        ret->tid = move(thread(responderThread, ret));
+      }
       g_dstates.modify([ret](servers_t& servers) { servers.push_back(ret); });
     }
   }
index 6e9538c1f5b3edd1547944e6bcee3d79093467f3..8398c140a07548a500df87eaa0f5be2eb15399f5 100644 (file)
@@ -356,6 +356,7 @@ struct DownstreamState
   bool upStatus{false};
   bool useECS{false};
   bool setCD{false};
+  std::atomic<bool> connected{false};
   bool isUp() const
   {
     if(availability == Availability::Down)