From 20c37deceb8a969580fcc8dda531de6c9f019a1c Mon Sep 17 00:00:00 2001 From: Pieter Lexis Date: Fri, 23 Mar 2018 11:11:52 +0100 Subject: [PATCH] rec: save rpzStats as a shared_ptr --- pdns/rpzloader.cc | 26 ++++++++++++++++---------- pdns/rpzloader.hh | 2 +- pdns/ws-recursor.cc | 16 +++++++++------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/pdns/rpzloader.cc b/pdns/rpzloader.cc index 0e5bb6e23..97706088a 100644 --- a/pdns/rpzloader.cc +++ b/pdns/rpzloader.cc @@ -250,31 +250,37 @@ void loadRPZFromFile(const std::string& fname, std::shared_ptr s_rpzStats; +static std::unordered_map > s_rpzStats; static std::mutex s_rpzStatsMutex; -rpzStats& getRPZZoneStats(const std::string& zone) +shared_ptr getRPZZoneStats(const std::string& zone) { std::lock_guard l(s_rpzStatsMutex); + if (s_rpzStats.find(zone) == s_rpzStats.end()) { + s_rpzStats[zone] = std::make_shared(); + } 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 defpol, uint32_t maxTTL, size_t zoneIdx, const TSIGTriplet& tt, size_t maxReceivedBytes, const ComboAddress& localAddress, std::shared_ptr zone, const uint16_t axfrTimeout) diff --git a/pdns/rpzloader.hh b/pdns/rpzloader.hh index b0d73d296..ac47bfb22 100644 --- a/pdns/rpzloader.hh +++ b/pdns/rpzloader.hh @@ -41,4 +41,4 @@ struct rpzStats std::atomic d_serial; }; -rpzStats& getRPZZoneStats(const std::string& zone); +shared_ptr getRPZZoneStats(const std::string& zone); diff --git a/pdns/ws-recursor.cc b/pdns/ws-recursor.cc index a6bfaa6f2..ce382a4ce 100644 --- a/pdns/ws-recursor.cc +++ b/pdns/ws-recursor.cc @@ -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; } -- 2.50.0