]> 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>
Wed, 30 Apr 2025 11:41:41 +0000 (13:41 +0200)
(cherry picked from commit 5f6f1444efdf400ff66f5572f676d3fabf998b68)

pdns/dnsdist.cc
pdns/dnsdist.hh
pdns/dnsdistdist/dnsdist-backend.cc

index b7c19b4a621bbd414895a8058c3618aad5795b01..cb08775fafe5aa444327866067e1b0f51b900af6 100644 (file)
@@ -1447,6 +1447,9 @@ ProcessQueryResult processQueryAfterRules(DNSQuestion& dq, LocalHolders& holders
     if (selectedBackend && selectedBackend->isTCPOnly()) {
       willBeForwardedOverUDP = false;
     }
+    else if (!selectedBackend) {
+      willBeForwardedOverUDP = !serverPool->isTCPOnly();
+    }
 
     uint32_t allowExpired = selectedBackend ? 0 : g_staleCacheEntriesTTL;
 
index 22eb4abeeaf3ecab5f56d289f0e216b2ad68af8b..232e4d158caaa4e34ff0804076a64b4b7cc92f91 100644 (file)
@@ -1071,10 +1071,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 {
index d59a5df0dc0744d4b98a82b02a5696f763b085fe..ddad2abc1f3a451fa71180923e18d7947d8b18ee 100644 (file)
@@ -974,6 +974,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)
@@ -984,6 +991,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
@@ -998,6 +1006,8 @@ void ServerPool::removeServer(shared_ptr<DownstreamState>& server)
       idx++;
       it++;
     }
+    tcpOnly = tcpOnly && it->second->isTCPOnly();
   }
+  d_tcpOnly = tcpOnly;
   *servers = std::move(newServers);
 }