]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Handle response dnstap messages arriving before the query ones
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 13 Feb 2025 16:14:08 +0000 (17:14 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 13 Feb 2025 16:14:08 +0000 (17:14 +0100)
Since we now use more than one TCP connection, it is entirely possible
for the response message to arrive before the query one, and our tests
should just deal with that.

regression-tests.dnsdist/test_Dnstap.py

index c9457afbe6d8a787d63d0ba193dc253033792a06..c40f52f497db2b6de513a54fb5aa0e65575a9891 100644 (file)
@@ -380,12 +380,23 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest):
         cls._remoteLoggerListener.daemon = True
         cls._remoteLoggerListener.start()
 
-    def getFirstDnstap(self):
+    def getFirstDnstap(self, messageType=None):
         self.assertFalse(self._remoteLoggerQueue.empty())
-        data = self._remoteLoggerQueue.get(False)
-        self.assertTrue(data)
-        dnstap = dnstap_pb2.Dnstap()
-        dnstap.ParseFromString(data)
+        unused = []
+        dnstap = None
+        while not self._remoteLoggerQueue.empty():
+            data = self._remoteLoggerQueue.get(False)
+            self.assertTrue(data)
+            dnstap = dnstap_pb2.Dnstap()
+            dnstap.ParseFromString(data)
+            if not messageType or dnstap.message.type == messageType:
+                break
+            unused.append(data)
+
+        # put back non-matching messages for later
+        for msg in reversed(unused):
+            self._remoteLoggerQueue.put(msg)
+
         return dnstap
 
     def testDnstap(self):
@@ -423,13 +434,13 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest):
         time.sleep(1)
 
         # check the dnstap message corresponding to the UDP query
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY)
 
         checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query)
         checkDnstapNoExtra(self, dnstap)
 
         # check the dnstap message corresponding to the UDP response
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE)
         checkDnstapResponse(self, dnstap, dnstap_pb2.UDP, response)
         checkDnstapNoExtra(self, dnstap)
 
@@ -444,13 +455,13 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest):
         time.sleep(1)
 
         # check the dnstap message corresponding to the TCP query
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY)
 
         checkDnstapQuery(self, dnstap, dnstap_pb2.TCP, query)
         checkDnstapNoExtra(self, dnstap)
 
         # check the dnstap message corresponding to the TCP response
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE)
         checkDnstapResponse(self, dnstap, dnstap_pb2.TCP, response)
         checkDnstapNoExtra(self, dnstap)
 
@@ -489,12 +500,12 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest):
         time.sleep(1)
 
         # check the dnstap message corresponding to the UDP query
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY)
         checkDnstapQuery(self, dnstap, dnstap_pb2.UDP, query)
         checkDnstapExtra(self, dnstap, b"Type,Query")
 
         # check the dnstap message corresponding to the UDP response
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE)
         checkDnstapResponse(self, dnstap, dnstap_pb2.UDP, response)
         checkDnstapExtra(self, dnstap, b"Type,Response")
 
@@ -509,12 +520,12 @@ class TestDnstapOverRemoteLoggerPool(DNSDistTest):
         time.sleep(1)
 
         # check the dnstap message corresponding to the TCP query
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_QUERY)
         checkDnstapQuery(self, dnstap, dnstap_pb2.TCP, query)
         checkDnstapExtra(self, dnstap, b"Type,Query")
 
         # check the dnstap message corresponding to the TCP response
-        dnstap = self.getFirstDnstap()
+        dnstap = self.getFirstDnstap(dnstap_pb2.Message.CLIENT_RESPONSE)
         checkDnstapResponse(self, dnstap, dnstap_pb2.TCP, response)
         checkDnstapExtra(self, dnstap, b"Type,Response")