]> 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>
Mon, 26 Mar 2018 09:14:57 +0000 (11:14 +0200)
(cherry picked from commit 20c37deceb8a969580fcc8dda531de6c9f019a1c)

pdns/rpzloader.cc
pdns/rpzloader.hh
pdns/ws-recursor.cc

index 1d4ab785de3dadfdbeeb8cbc1ceea6ec53edd3bb..7db92cb8458877536cc15ff6ea1c0ebd5b41b683 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 71e4de0b4ff8fb3f751e91ff12e7526fabe4dcce..0ce1833509b3059cd41499b3d1afc7b05dba1692 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 74d74d9d58f7bc38a128e8a40b98fcd54bfcc470..5774ac88e23bb6f6e66caf0407fd2ef3a2bf632a 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;
   }