]> granicus.if.org Git - pdns/commitdiff
dnsdist: Use a reserve()'d unordered_map for exceed* functions
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 15 Mar 2018 09:49:25 +0000 (10:49 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 15 Mar 2018 10:46:50 +0000 (11:46 +0100)
pdns/dnsdist-lua-inspection.cc
pdns/dnsdist-lua.cc

index e2c32cee45581a3b218319ed38e9ab804fcc6c2c..c75d0bad4dbc05aa21dc56a93d5acf2f013947f7 100644 (file)
@@ -75,19 +75,21 @@ static std::unordered_map<unsigned int, vector<boost::variant<string,double>>> g
   return ret;
 }
 
-static void filterScore(map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan >& counts,
+typedef std::unordered_map<ComboAddress, unsigned int, ComboAddress::addressOnlyHash, ComboAddress::addressOnlyEqual> counts_t;
+
+static counts_t filterScore(const counts_t& counts,
                         double delta, unsigned int rate)
 {
+  counts_t ret;
+
   double lim = delta*rate;
-  for(auto iter = counts.begin(); iter != counts.end();) {
-    if (iter->second <= lim) {
-      iter = counts.erase(iter);
-    }
-    else {
-      iter++;
+  for(const auto& c : counts) {
+    if (c.second > lim) {
+      ret[c.first] = c.second;
     }
   }
 
+  return ret;
 }
 
 
@@ -140,7 +142,6 @@ static vector<pair<unsigned int, std::unordered_map<string,string> > > getRespRi
   return ret;
 }
 
-typedef   map<ComboAddress, unsigned int,ComboAddress::addressOnlyLessThan > counts_t;
 static counts_t exceedRespGen(unsigned int rate, int seconds, std::function<void(counts_t&, const Rings::Response&)> T)
 {
   counts_t counts;
@@ -151,6 +152,7 @@ static counts_t exceedRespGen(unsigned int rate, int seconds, std::function<void
 
   {
     std::lock_guard<std::mutex> lock(g_rings.respMutex);
+    counts.reserve(g_rings.respRing.size());
     for(const auto& c : g_rings.respRing) {
       if(seconds && c.when < cutoff)
         continue;
@@ -164,8 +166,7 @@ static counts_t exceedRespGen(unsigned int rate, int seconds, std::function<void
   }
 
   double delta = seconds ? seconds : DiffTime(now, mintime);
-  filterScore(counts, delta, rate);
-  return counts;
+  return filterScore(counts, delta, rate);
 }
 
 static counts_t exceedQueryGen(unsigned int rate, int seconds, std::function<void(counts_t&, const Rings::Query&)> T)
@@ -178,6 +179,7 @@ static counts_t exceedQueryGen(unsigned int rate, int seconds, std::function<voi
 
   {
     ReadLock rl(&g_rings.queryLock);
+    counts.reserve(g_rings.respRing.size());
     for(const auto& c : g_rings.queryRing) {
       if(seconds && c.when < cutoff)
         continue;
@@ -190,8 +192,7 @@ static counts_t exceedQueryGen(unsigned int rate, int seconds, std::function<voi
   }
 
   double delta = seconds ? seconds : DiffTime(now, mintime);
-  filterScore(counts, delta, rate);
-  return counts;
+  return filterScore(counts, delta, rate);
 }
 
 
index 9ad056fd8af453963b5e1889c6b01eb57891a018..dfe31e4e056b827ea1bf8cdc0457b42f69cedfca 100644 (file)
@@ -821,7 +821,7 @@ void setupLuaConfig(bool client)
     });
 
   g_lua.writeFunction("addDynBlocks",
-                      [](const map<ComboAddress,unsigned int, ComboAddress::addressOnlyLessThan>& m, const std::string& msg, boost::optional<int> seconds, boost::optional<DNSAction::Action> action) {
+                      [](const std::unordered_map<ComboAddress,unsigned int, ComboAddress::addressOnlyHash, ComboAddress::addressOnlyEqual>& m, const std::string& msg, boost::optional<int> seconds, boost::optional<DNSAction::Action> action) {
                            setLuaSideEffect();
                           auto slow = g_dynblockNMG.getCopy();
                           struct timespec until, now;