]> granicus.if.org Git - pdns/commitdiff
fix up dns ring measurements for BW and NXDOMAIN to not inflate rates erroneously
authorbert hubert <bert.hubert@netherlabs.nl>
Tue, 8 Dec 2015 10:05:23 +0000 (11:05 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Tue, 8 Dec 2015 10:05:23 +0000 (11:05 +0100)
pdns/dnsdist-lua2.cc

index 9c036ecb259ba17076140c7b1d37810ce73a6eff..40951bbbdc0371aa61046c7a50172f7d07d47734 100644 (file)
@@ -22,8 +22,7 @@ static double DiffTime(const struct timespec& first, const struct timespec& seco
 }
 
 map<ComboAddress,int> filterScore(const map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan >& counts, 
-                                 struct timespec& mintime,
-                                 struct timespec& maxtime, int rate)
+                                 double delta, int rate)
 {
   std::multimap<unsigned int,ComboAddress> score;
   for(const auto& e : counts) 
@@ -31,7 +30,6 @@ map<ComboAddress,int> filterScore(const map<ComboAddress, unsigned int,ComboAddr
 
   map<ComboAddress,int> ret;
   
-  double delta=DiffTime(mintime, maxtime);
   double lim = delta*rate;
   
   for(auto s = score.crbegin(); s != score.crend() && s->first > lim; ++s) {
@@ -45,42 +43,45 @@ typedef   map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan > cou
 map<ComboAddress,int> exceedRespGen(int rate, int seconds, std::function<void(counts_t&, const Rings::Response&)> T) 
 {
   counts_t counts;
-  struct timespec mintime, maxtime, cutoff;
-  clock_gettime(CLOCK_MONOTONIC, &maxtime);
-  mintime=cutoff=maxtime;
+  struct timespec cutoff, mintime, now;
+  clock_gettime(CLOCK_MONOTONIC, &now);
+  cutoff = mintime = now;
   cutoff.tv_sec -= seconds;
   
   for(const auto& c : g_rings.respRing) {
     if(seconds && c.when < cutoff)
       continue;
+    if(now < c.when)
+      continue;
 
     T(counts, c);
     if(c.when < mintime)
       mintime = c.when;
   }
-  
-  return filterScore(counts, mintime, maxtime, rate);
+  double delta = seconds ? seconds : DiffTime(now, mintime);
+  return filterScore(counts, delta, rate);
 }
 
 map<ComboAddress,int> exceedQueryGen(int rate, int seconds, std::function<void(counts_t&, const Rings::Query&)> T) 
 {
   counts_t counts;
-  struct timespec mintime, maxtime, cutoff;
-  clock_gettime(CLOCK_MONOTONIC, &maxtime);
-  mintime=cutoff=maxtime;
+  struct timespec cutoff, mintime, now;
+  clock_gettime(CLOCK_MONOTONIC, &now);
+  cutoff = mintime = now;
   cutoff.tv_sec -= seconds;
-  
+
   ReadLock rl(&g_rings.queryLock);
   for(const auto& c : g_rings.queryRing) {
     if(seconds && c.when < cutoff)
       continue;
-
+    if(now < c.when)
+      continue;
     T(counts, c);
     if(c.when < mintime)
       mintime = c.when;
   }
-  
-  return filterScore(counts, mintime, maxtime, rate);
+  double delta = seconds ? seconds : DiffTime(now, mintime);
+  return filterScore(counts, delta, rate);
 }