]> granicus.if.org Git - pdns/commitdiff
add timeout reporting to inflighter
authorBert Hubert <bert.hubert@netherlabs.nl>
Sun, 13 Jun 2010 12:46:34 +0000 (12:46 +0000)
committerBert Hubert <bert.hubert@netherlabs.nl>
Sun, 13 Jun 2010 12:46:34 +0000 (12:46 +0000)
git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@1634 d19b8d6e-7fed-0310-83ef-9ca221ded41b

pdns/dnsbulktest.cc
pdns/inflighter.cc

index 80cf4dba5146488cb0e04a0f0074528c2e49328c..cf8c07baa1451f617b74871847bea3c7a9315745 100644 (file)
@@ -1,4 +1,5 @@
 #include "inflighter.cc"
+#include <deque>
 #include "namespaces.hh"
 #include "dnsparser.hh"
 #include "sstuff.hh"
@@ -20,7 +21,7 @@ struct SendReceive
   typedef int Identifier;
   typedef DNSResult Answer; // ip 
   int d_socket;
-  uint16_t d_id;
+  deque<uint16_t> d_idqueue;
   
   
   SendReceive(const std::string& remoteAddr, uint16_t port)
@@ -33,6 +34,8 @@ struct SendReceive
     connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen());
     d_oks = d_errors = d_nodatas = d_nxdomains = d_unknowns = 0;
     d_receiveds = d_receiveerrors = 0;
+    for(unsigned int id =0 ; id < numeric_limits<uint16_t>::max(); ++id) 
+      d_idqueue.push_back(id);
   }
   
   ~SendReceive()
@@ -49,7 +52,8 @@ struct SendReceive
   
     DNSPacketWriter pw(packet, domain, QType::A);
     
-    pw.getHeader()->id = d_id++;
+    pw.getHeader()->id = d_idqueue.front();
+    d_idqueue.pop_front();
     pw.getHeader()->rd = 1;
     pw.getHeader()->qr = 0;
     
@@ -95,6 +99,11 @@ struct SendReceive
     return 0;
   }
   
+  void deliverTimeout(const Identifier& id)
+  {
+    d_idqueue.push_back(id);
+  }
+  
   void deliverAnswer(string& domain, const DNSResult& dr)
   {
     cout<<domain<<": rcode: "<<dr.rcode;
index 69ae344f24f4a0b4e949eb58c93800df2a0b7f7e..16778500d1d68b56c58b1ceacae9770c43d3715d 100644 (file)
@@ -129,6 +129,7 @@ template<typename Container, typename SendReceive> void Inflighter<Container, Se
 
         for(typename waiters_by_ttd_index_t::iterator valiter = waiters_index.begin(); valiter != waiters_index.end(); ) {
           if(valiter->ttd.tv_sec < now.tv_sec || (valiter->ttd.tv_sec == now.tv_sec && valiter->ttd.tv_usec < now.tv_usec)) {
+            d_sr.deliverTimeout(valiter->id);  // so backend can release id
             waiters_index.erase(valiter++);
             // cerr<<"Have timeout for id="<< valiter->id <<endl;
             d_timeouts++;