]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Fix cache lookup for unavailable TCP-only backends
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 10 Apr 2025 13:49:51 +0000 (15:49 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 10 Apr 2025 13:49:51 +0000 (15:49 +0200)
pdns/dnsdistdist/dnsdist-backend.cc
pdns/dnsdistdist/dnsdist.cc
pdns/dnsdistdist/dnsdist.hh

index 33bcc7b6f58267f0f167abbe6f98368a73164186..2f3cccb91552b455929e5fe99dedab3b629bd994 100644 (file)
@@ -1052,6 +1052,13 @@ void ServerPool::addServer(shared_ptr<DownstreamState>& server)
     serv.first = idx++;
   }
   *servers = std::make_shared<const ServerPolicy::NumberedServerVector>(std::move(newServers));
+
+  if ((*servers)->size() == 1) {
+    d_tcpOnly = server->isTCPOnly();
+  }
+  else if (d_tcpOnly && !server->isTCPOnly()) {
+    d_tcpOnly = false;
+  }
 }
 
 void ServerPool::removeServer(shared_ptr<DownstreamState>& server)
@@ -1062,6 +1069,7 @@ void ServerPool::removeServer(shared_ptr<DownstreamState>& server)
   auto newServers = std::make_shared<ServerPolicy::NumberedServerVector>(*(*servers));
   size_t idx = 1;
   bool found = false;
+  bool tcpOnly = true;
   for (auto it = newServers->begin(); it != newServers->end();) {
     if (found) {
       /* we need to renumber the servers placed
@@ -1076,7 +1084,9 @@ void ServerPool::removeServer(shared_ptr<DownstreamState>& server)
       idx++;
       it++;
     }
+    tcpOnly = tcpOnly && it->second->isTCPOnly();
   }
+  d_tcpOnly = tcpOnly;
   *servers = std::move(newServers);
 }
 
index 3ca83043d2c3f855d88b89016c7754a4b6b93075..bd2e71eeaba4b214bf9b7a55cbadf5afe466b708 100644 (file)
@@ -1421,6 +1421,9 @@ ProcessQueryResult processQueryAfterRules(DNSQuestion& dnsQuestion, std::shared_
     if (selectedBackend && selectedBackend->isTCPOnly()) {
       willBeForwardedOverUDP = false;
     }
+    else if (!selectedBackend) {
+      willBeForwardedOverUDP = !serverPool->isTCPOnly();
+    }
 
     uint32_t allowExpired = selectedBackend ? 0 : dnsdist::configuration::getCurrentRuntimeConfiguration().d_staleCacheEntriesTTL;
 
index 0cf39e44810158b3b20222c710785aa6734a6d77..8c3e35b544d632b75b73c684d6f6d8d9dd90c713 100644 (file)
@@ -927,10 +927,15 @@ struct ServerPool
   const std::shared_ptr<const ServerPolicy::NumberedServerVector> getServers();
   void addServer(shared_ptr<DownstreamState>& server);
   void removeServer(shared_ptr<DownstreamState>& server);
+  bool isTCPOnly() const
+  {
+    return d_tcpOnly;
+  }
 
 private:
   SharedLockGuarded<std::shared_ptr<const ServerPolicy::NumberedServerVector>> d_servers;
   bool d_useECS{false};
+  bool d_tcpOnly{false};
 };
 
 enum ednsHeaderFlags