]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: save rpzStats as a shared_ptr
authorPieter Lexis <pieter.lexis@powerdns.com>
Fri, 23 Mar 2018 10:11:52 +0000 (11:11 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Fri, 23 Mar 2018 10:11:52 +0000 (11:11 +0100)
pdns/rpzloader.cc
pdns/rpzloader.hh
pdns/ws-recursor.cc

index 0e5bb6e23b933a2090f11c37df071a9f4ac33ecc..97706088a3e89af3560aa3567bf4555c7ff7c3f2 100644 (file)
@@ -250,31 +250,37 @@ void loadRPZFromFile(const std::string& fname, std::shared_ptr<DNSFilterEngine::
   }
 }
 
-static std::unordered_map<std::string, rpzStats> s_rpzStats;
+static std::unordered_map<std::string, shared_ptr<rpzStats> > s_rpzStats;
 static std::mutex s_rpzStatsMutex;
 
-rpzStats& getRPZZoneStats(const std::string& zone)
+shared_ptr<rpzStats> getRPZZoneStats(const std::string& zone)
 {
   std::lock_guard<std::mutex> l(s_rpzStatsMutex);
+  if (s_rpzStats.find(zone) == s_rpzStats.end()) {
+    s_rpzStats[zone] = std::make_shared<rpzStats>();
+  }
   return s_rpzStats[zone];
 }
 
 static void incRPZFailedTransfers(const std::string& zone)
 {
-  auto& stats = getRPZZoneStats(zone);
-  stats.d_failedTransfers++;
+  auto stats = getRPZZoneStats(zone);
+  if (stats != nullptr)
+    stats->d_failedTransfers++;
 }
 
 static void setRPZZoneNewState(const std::string& zone, uint32_t serial, uint64_t numberOfRecords, bool wasAXFR)
 {
-  auto& stats = getRPZZoneStats(zone);
-  stats.d_successfulTransfers++;
+  auto stats = getRPZZoneStats(zone);
+  if (stats == nullptr)
+    return;
+  stats->d_successfulTransfers++;
   if (wasAXFR) {
-    stats.d_fullTransfers++;
+    stats->d_fullTransfers++;
   }
-  stats.d_lastUpdate = time(nullptr);
-  stats.d_serial = serial;
-  stats.d_numberOfRecords = numberOfRecords;
+  stats->d_lastUpdate = time(nullptr);
+  stats->d_serial = serial;
+  stats->d_numberOfRecords = numberOfRecords;
 }
 
 void RPZIXFRTracker(const ComboAddress& master, boost::optional<DNSFilterEngine::Policy> defpol, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, std::shared_ptr<DNSFilterEngine::Zone> zone, const uint16_t axfrTimeout)
index b0d73d296c3a99f5e4986afb65f419f84c4f0da3..ac47bfb224d005869b60f9c1696137175f1496e8 100644 (file)
@@ -41,4 +41,4 @@ struct rpzStats
   std::atomic<uint32_t> d_serial;
 };
 
-rpzStats& getRPZZoneStats(const std::string& zone);
+shared_ptr<rpzStats> getRPZZoneStats(const std::string& zone);
index a6bfaa6f2ce432eb499216f15cdc9fff59ff3003..ce382a4ceb1b27e63eab90d163620226e673ce2e 100644 (file)
@@ -397,14 +397,16 @@ static void apiServerRPZ(HttpRequest* req, HttpResponse* resp) {
     if (zone == nullptr)
       continue;
     auto name = zone->getName();
-    auto& stats = getRPZZoneStats(*name);
+    auto stats = getRPZZoneStats(*name);
+    if (stats == nullptr)
+      continue;
     Json::object zoneInfo = {
-      {"transfers_failed", (double)stats.d_failedTransfers},
-      {"transfers_success", (double)stats.d_successfulTransfers},
-      {"transfers_full", (double)stats.d_fullTransfers},
-      {"records", (double)stats.d_numberOfRecords},
-      {"last_update", (double)stats.d_lastUpdate},
-      {"serial", (double)stats.d_serial},
+      {"transfers_failed", (double)stats->d_failedTransfers},
+      {"transfers_success", (double)stats->d_successfulTransfers},
+      {"transfers_full", (double)stats->d_fullTransfers},
+      {"records", (double)stats->d_numberOfRecords},
+      {"last_update", (double)stats->d_lastUpdate},
+      {"serial", (double)stats->d_serial},
     };
     ret[*name] = zoneInfo;
   }