]> granicus.if.org Git - pdns/commitdiff
fix up bandwidth exceeded limits, move dnsheader (12 bytes) into ringbuffer, add...
authorbert hubert <bert.hubert@powerdns.com>
Tue, 8 Dec 2015 15:52:18 +0000 (16:52 +0100)
committerbert hubert <bert.hubert@powerdns.com>
Tue, 8 Dec 2015 15:52:18 +0000 (16:52 +0100)
pdns/dnsdist-lua.cc
pdns/dnsdist-lua2.cc
pdns/dnsdist-tcp.cc
pdns/dnsdist.cc
pdns/dnsdist.hh
pdns/dnsreplay.cc
pdns/misc.cc
pdns/misc.hh

index 91983ee5c31b2a3db70ada03e2315a3d3d080766..f50beee1e76afcb2d0fcd1cf5df57a72ffa11a29 100644 (file)
@@ -748,7 +748,7 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
       for(const auto& r : ring) {
        item["name"]=r.name.toString();
        item["qtype"]=r.qtype;
-       item["rcode"]=r.rcode;
+       item["rcode"]=r.dh.rcode;
        item["usec"]=r.usec;
        ret.push_back(item);
       }
@@ -762,7 +762,7 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
        std::lock_guard<std::mutex> lock(g_rings.respMutex);
        if(!labels) {
          for(const auto& a : g_rings.respRing) {
-           if(a.rcode!=kind)
+           if(a.dh.rcode!=kind)
              continue;
            counts[a.name]++;
            total++;
@@ -771,7 +771,7 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
        else {
          unsigned int lab = *labels;
          for(auto a : g_rings.respRing) {
-           if(a.rcode!=kind)
+           if(a.dh.rcode!=kind)
              continue;
 
            a.name.trimToLabels(lab);
index 40951bbbdc0371aa61046c7a50172f7d07d47734..0118c4ea8b7c7711399f06065263465d5dec89ac 100644 (file)
@@ -8,19 +8,6 @@
 #include <map>
 #include <fstream>
 
-
-static double DiffTime(const struct timespec& first, const struct timespec& second)
-{
-  int seconds=second.tv_sec - first.tv_sec;
-  int nseconds=second.tv_nsec - first.tv_nsec;
-  
-  if(nseconds < 0) {
-    seconds-=1;
-    nseconds+=1000000000;
-  }
-  return seconds + nseconds/1000000000.0;
-}
-
 map<ComboAddress,int> filterScore(const map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan >& counts, 
                                  double delta, int rate)
 {
@@ -31,7 +18,6 @@ map<ComboAddress,int> filterScore(const map<ComboAddress, unsigned int,ComboAddr
   map<ComboAddress,int> ret;
   
   double lim = delta*rate;
-  
   for(auto s = score.crbegin(); s != score.crend() && s->first > lim; ++s) {
     ret[s->second]=s->first;
   }
@@ -89,7 +75,7 @@ map<ComboAddress,int> exceedRCode(int rate, int seconds, int rcode)
 {
   return exceedRespGen(rate, seconds, [rcode](counts_t& counts, const Rings::Response& r) 
                   {
-                    if(r.rcode == rcode)
+                    if(r.dh.rcode == rcode)
                       counts[r.requestor]++;
                   });
 }
@@ -236,10 +222,14 @@ void moreLua()
       clock_gettime(CLOCK_MONOTONIC, &now);
             
       std::multimap<struct timespec, string> out;
+
+      boost::format      fmt("%-7.1f %-47s %-5d %-25s %-5s %-4.1f %-2s %-2s %-2s %s\n");
+      g_outputBuffer+= (fmt % "Time" % "Client" % "ID" % "Name" % "Type" % "Lat." % "TC" % "RD" % "AA" % "Rcode").str();
+
       for(const auto& c : qr) {
         if((nm && nm->match(c.requestor)) || (dn && c.name.isPartOf(*dn)))  {
           QType qt(c.qtype);
-          out.insert(make_pair(c.when,std::to_string(DiffTime(now, c.when))+'\t'+c.requestor.toStringWithPort() +'\t'+c.name.toString() + '\t' + qt.getName()));
+          out.insert(make_pair(c.when, (fmt % DiffTime(now, c.when) % c.requestor.toStringWithPort() % htons(c.dh.id) % c.name.toString() % qt.getName()  % "" % (c.dh.tc ? "TC" : "") % (c.dh.rd? "RD" : "") % (c.dh.aa? "AA" : "") %  "Question").str()  )) ;
 
           if(limit && *limit==++num)
             break;
@@ -247,10 +237,12 @@ void moreLua()
       }
       num=0;
 
+
+
       for(const auto& c : rr) {
         if((nm && nm->match(c.requestor)) || (dn && c.name.isPartOf(*dn)))  {
           QType qt(c.qtype);
-          out.insert(make_pair(c.when,std::to_string(DiffTime(now, c.when))+'\t'+c.requestor.toStringWithPort() +'\t'+c.name.toString() + '\t' + qt.getName()+'\t' + std::to_string(c.usec/1000.0) + '\t'+ RCode::to_s(c.rcode)));
+          out.insert(make_pair(c.when, (fmt % DiffTime(now, c.when) % c.requestor.toStringWithPort() % htons(c.dh.id) % c.name.toString()  % qt.getName()  % (c.usec/1000.0) % (c.dh.tc ? "TC" : "") % (c.dh.rd? "RD" : "") % (c.dh.aa? "AA" : "") % RCode::to_s(c.dh.rcode)).str()  )) ;
 
           if(limit && *limit==++num)
             break;
@@ -259,7 +251,6 @@ void moreLua()
 
       for(const auto& p : out) {
         g_outputBuffer+=p.second;
-        g_outputBuffer.append(1,'\n');
       }
     });
 }
index 60936ad78891476b8419596835789314b8943925..e1766e1eedc0a8f0e06a4ef894c31d29fe8de3ff 100644 (file)
@@ -174,7 +174,7 @@ void* tcpClientThread(int pipefd)
 
        {
          WriteLock wl(&g_rings.queryLock);
-         g_rings.queryRing.push_back({now,ci.remote,qname,qtype});
+         g_rings.queryRing.push_back({now,ci.remote,qname,(uint16_t)queryLen,qtype,*dh});
        }
 
        g_stats.queries++;
@@ -370,7 +370,14 @@ void* tcpClientThread(int pipefd)
           writen2WithTimeout(ci.fd, response, responseLen, ds->tcpSendTimeout);
 
         g_stats.responses++;
-        
+        struct timespec answertime;
+        clock_gettime(CLOCK_MONOTONIC, &answertime);
+        unsigned int udiff = 1000000.0*DiffTime(now,answertime);
+        {
+          std::lock_guard<std::mutex> lock(g_rings.respMutex);
+          g_rings.respRing.push_back({answertime,  ci.remote, qname, qtype, (unsigned int)udiff, (unsigned int)responseLen, *dh});
+        }
+
         largerQuery.clear();
         rewrittenResponse.clear();
       }
index 87aaf4703664c000e0bc38a7e06761b62a37d764..a40d37eb9e8b702275554d3fc476c4720d7985f9 100644 (file)
@@ -233,7 +233,7 @@ void* responderThread(std::shared_ptr<DownstreamState> state)
       struct timespec ts;
       clock_gettime(CLOCK_MONOTONIC, &ts);
       std::lock_guard<std::mutex> lock(g_rings.respMutex);
-      g_rings.respRing.push_back({ts, ids->origRemote, ids->qname, ids->qtype, (uint8_t)dh->rcode, (unsigned int)udiff, (unsigned int)len});
+      g_rings.respRing.push_back({ts, ids->origRemote, ids->qname, ids->qtype, (unsigned int)udiff, (unsigned int)len, *dh});
     }
     if(dh->rcode == RCode::ServFail)
       g_stats.servfailResponses++;
@@ -516,7 +516,7 @@ try
       clock_gettime(CLOCK_MONOTONIC, &now);
       {
         WriteLock wl(&g_rings.queryLock);
-        g_rings.queryRing.push_back({now,remote,qname,(uint16_t)len,qtype});
+        g_rings.queryRing.push_back({now,remote,qname,(uint16_t)len,qtype, *dh});
       }
       
       if(auto got=localDynBlock->lookup(remote)) {
index c48fda1c5e3c116aa1b5d958a255d5c2a03c40b4..c2178abd376eb6bc3305bcbeb77a18dc8a3bde40 100644 (file)
@@ -212,6 +212,7 @@ struct Rings {
     DNSName name;
     uint16_t size;
     uint16_t qtype;
+    struct dnsheader dh;
   };
   boost::circular_buffer<Query> queryRing;
   struct Response
@@ -220,9 +221,9 @@ struct Rings {
     ComboAddress requestor;
     DNSName name;
     uint16_t qtype;
-    uint8_t rcode;
     unsigned int usec;
     unsigned int size;
+    struct dnsheader dh;
   };
   boost::circular_buffer<Response> respRing;
   std::mutex respMutex;
index 2ace0421f8582e3200e4f52a7e6a58eb92e00734..266a0734fa0480e6358cf81457026df8f0612bfe 100644 (file)
@@ -203,17 +203,6 @@ unsigned int s_webetter, s_origbetter, s_norecursionavailable;
 unsigned int s_weunmatched, s_origunmatched;
 unsigned int s_wednserrors, s_origdnserrors, s_duplicates;
 
-static double DiffTime(const struct timeval& first, const struct timeval& second)
-{
-  int seconds=second.tv_sec - first.tv_sec;
-  int useconds=second.tv_usec - first.tv_usec;
-  
-  if(useconds < 0) {
-    seconds-=1;
-    useconds+=1000000;
-  }
-  return seconds + useconds/1000000.0;
-}
 
 
 void WeOrigSlowQueriesDelta(int& weOutstanding, int& origOutstanding, int& weSlow, int& origSlow)
index 61c64f9fe93ca5268ecef5f3cf303a92bbd8d157..b2ee147ba9b7dbc2e0e03ae220a53c114e31a683 100644 (file)
@@ -1208,3 +1208,27 @@ uint64_t getCPUTimeSystem(const std::string&)
   getrusage(RUSAGE_SELF, &ru);
   return (ru.ru_stime.tv_sec*1000ULL + ru.ru_stime.tv_usec/1000);
 }
+
+double DiffTime(const struct timespec& first, const struct timespec& second)
+{
+  int seconds=second.tv_sec - first.tv_sec;
+  int nseconds=second.tv_nsec - first.tv_nsec;
+  
+  if(nseconds < 0) {
+    seconds-=1;
+    nseconds+=1000000000;
+  }
+  return seconds + nseconds/1000000000.0;
+}
+
+double DiffTime(const struct timeval& first, const struct timeval& second)
+{
+  int seconds=second.tv_sec - first.tv_sec;
+  int useconds=second.tv_usec - first.tv_usec;
+  
+  if(useconds < 0) {
+    seconds-=1;
+    useconds+=1000000;
+  }
+  return seconds + useconds/1000000.0;
+}
index eb1dbd4482040986907e18e53ec7175ce0939e8d..9036bb2d63a47234ebd0b54c4406950b539b3dc2 100644 (file)
@@ -645,3 +645,5 @@ const char* addS(const C& c, typename std::enable_if<std::is_class<C>::value>::t
   return addS(c.size());
 }
 
+double DiffTime(const struct timespec& first, const struct timespec& second);
+double DiffTime(const struct timeval& first, const struct timeval& second);