]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Use a counter for pipelined TCP queries
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 14 Sep 2020 09:42:29 +0000 (11:42 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 10 Nov 2020 08:52:23 +0000 (09:52 +0100)
It turns out that collisions do happen with a random ID.

pdns/dnsdistdist/dnsdist-tcp-downstream.cc
regression-tests.dnsdist/test_OOOR.py

index 8b5e56e0bb4798ed4c8bf6f40b5843e106de851b..4fa155c55cad7eaeb95953cf3ba099c245dc487e 100644 (file)
@@ -423,7 +423,7 @@ IOState TCPConnectionToBackend::handleResponse(std::shared_ptr<TCPConnectionToBa
 
     auto it = d_pendingResponses.find(queryId);
     if (it == d_pendingResponses.end()) {
-      DEBUGLOG("could not found any corresponding query for ID "<<queryId);
+      DEBUGLOG("could not find any corresponding query for ID "<<queryId<<". This is likely a duplicated ID over the same TCP connection, giving up!");
       notifyAllQueriesFailed(now);
       return IOState::Done;
     }
index e2f2bc4d2e3d3123f97ce85cf30a5bffcfeb01b4..ae1e457461587e15dd17eb90ba339248a13cfbe4 100644 (file)
@@ -180,8 +180,11 @@ class TestOOORWithClientNotBackend(DNSDistTest):
 
         conn = self.openTCPConnection()
 
+        counter = 0
         for name in names:
             query = dns.message.make_query(name, 'A', 'IN', use_edns=False)
+            query.id = counter
+            counter = counter + 1
 
             self.sendTCPQueryOverConnection(conn, query)
 
@@ -212,8 +215,11 @@ class TestOOORWithClientNotBackend(DNSDistTest):
 
         conn = self.openTCPConnection()
 
+        counter = 0
         for name in names:
             query = dns.message.make_query(name, 'A', 'IN', use_edns=False)
+            query.id = counter
+            counter = counter + 1
 
             self.sendTCPQueryOverConnection(conn, query)
 
@@ -263,8 +269,11 @@ class TestOOORWithClientAndBackend(DNSDistTest):
 
         conn = self.openTCPConnection()
 
+        counter = 0
         for name in names:
             query = dns.message.make_query(name, 'A', 'IN', use_edns=False)
+            query.id = counter
+            counter = counter + 1
 
             self.sendTCPQueryOverConnection(conn, query)
 
@@ -293,8 +302,11 @@ class TestOOORWithClientAndBackend(DNSDistTest):
 
         conn = self.openTCPConnection()
 
+        counter = 0
         for name in names:
             query = dns.message.make_query(name, 'A', 'IN', use_edns=False)
+            query.id = counter
+            counter = counter + 1
 
             self.sendTCPQueryOverConnection(conn, query)