]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Convert the dynamic blocks topN to LockGuarded
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 30 Apr 2021 13:51:35 +0000 (15:51 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 17 Aug 2021 12:04:45 +0000 (14:04 +0200)
pdns/dnsdist-dynblocks.hh
pdns/dnsdistdist/dnsdist-dynblocks.cc

index e3c1a6247a64e4687c00492f3adc51657404410b..d802d05e1e1ce4eb7de967657ee33e66624d046e 100644 (file)
@@ -404,12 +404,15 @@ private:
     std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> smtData;
   };
 
-  /* Protects s_topNMGsByReason and s_topSMTsByReason. s_metricsData should only be accessed
-     by the dynamic blocks maintenance thread so it does not need a lock. */
-  static std::mutex s_topsMutex;
+  struct Tops
+  {
+    std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> topNMGsByReason;
+    std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> topSMTsByReason;
+  };
+
+  static LockGuarded<Tops> s_tops;
+  /* s_metricsData should only be accessed by the dynamic blocks maintenance thread so it does not need a lock */
   // need N+1 datapoints to be able to do the diff after a collection point has been reached
   static std::list<MetricsSnapshot> s_metricsData;
-  static std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> s_topNMGsByReason;
-  static std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> s_topSMTsByReason;
   static size_t s_topN;
 };
index ef33e33d983384bb2dae4dfd0d25aa6eb36371bc..fac0624264bcb16cb7cf7edf66dae78502f3a50d 100644 (file)
@@ -493,10 +493,9 @@ struct DynBlockEntryStat
   unsigned int lastSeenValue{0};
 };
 
-std::mutex DynBlockMaintenance::s_topsMutex;
 std::list<DynBlockMaintenance::MetricsSnapshot> DynBlockMaintenance::s_metricsData;
-std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> DynBlockMaintenance::s_topNMGsByReason;
-std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> DynBlockMaintenance::s_topSMTsByReason;
+
+LockGuarded<DynBlockMaintenance::Tops> DynBlockMaintenance::s_tops;
 size_t DynBlockMaintenance::s_topN{20};
 time_t DynBlockMaintenance::s_expiredDynBlocksPurgeInterval{60};
 
@@ -641,9 +640,9 @@ void DynBlockMaintenance::generateMetrics()
   }
 
   {
-    std::lock_guard<std::mutex> lock(s_topsMutex);
-    s_topNMGsByReason = std::move(topNMGs);
-    s_topSMTsByReason = std::move(topSMTs);
+    auto tops = s_tops.lock();
+    tops->topNMGsByReason = std::move(topNMGs);
+    tops->topSMTsByReason = std::move(topSMTs);
   }
 }
 
@@ -710,12 +709,10 @@ void DynBlockMaintenance::run()
 
 std::map<std::string, std::list<std::pair<Netmask, unsigned int>>> DynBlockMaintenance::getHitsForTopNetmasks()
 {
-  std::lock_guard<std::mutex> lock(s_topsMutex);
-  return s_topNMGsByReason;
+  return s_tops.lock()->topNMGsByReason;
 }
 
 std::map<std::string, std::list<std::pair<DNSName, unsigned int>>> DynBlockMaintenance::getHitsForTopSuffixes()
 {
-  std::lock_guard<std::mutex> lock(s_topsMutex);
-  return s_topSMTsByReason;
+  return s_tops.lock()->topSMTsByReason;
 }