From aebb81e4d15b3a21fd6a606a6ca72886232552cb Mon Sep 17 00:00:00 2001 From: bert hubert Date: Mon, 7 Mar 2016 21:09:02 +0100 Subject: [PATCH] make the recursor counters atomic, closes #1747 --- pdns/rec_channel_rec.cc | 13 +++++++ pdns/syncres.cc | 20 +++++----- pdns/syncres.hh | 83 +++++++++++++++++++++-------------------- 3 files changed, 65 insertions(+), 51 deletions(-) diff --git a/pdns/rec_channel_rec.cc b/pdns/rec_channel_rec.cc index 90e5851bda..6e94c88d10 100644 --- a/pdns/rec_channel_rec.cc +++ b/pdns/rec_channel_rec.cc @@ -36,6 +36,7 @@ pthread_mutex_t g_carbon_config_lock=PTHREAD_MUTEX_INITIALIZER; map d_get32bitpointers; map d_get64bitpointers; +map*> d_getatomics; map > d_get64bitmembers; pthread_mutex_t d_dynmetricslock = PTHREAD_MUTEX_INITIALIZER; map* > d_dynmetrics; @@ -48,6 +49,12 @@ void addGetStat(const string& name, const uint64_t* place) d_get64bitpointers[name]=place; } +void addGetStat(const string& name, const std::atomic* place) +{ + d_getatomics[name]=place; +} + + void addGetStat(const string& name, function f ) { d_get64bitmembers[name]=f; @@ -74,6 +81,8 @@ optional get(const string& name) return *d_get32bitpointers.find(name)->second; if(d_get64bitpointers.count(name)) return *d_get64bitpointers.find(name)->second; + if(d_getatomics.count(name)) + return d_getatomics.find(name)->second->load(); if(d_get64bitmembers.count(name)) return d_get64bitmembers.find(name)->second(); @@ -95,6 +104,10 @@ map getAllStatsMap() for(const auto& the64bits : d_get64bitpointers) { ret.insert(make_pair(the64bits.first, std::to_string(*the64bits.second))); } + for(const auto& atomic : d_getatomics) { + ret.insert(make_pair(atomic.first, std::to_string(atomic.second->load()))); + } + for(const auto& the64bitmembers : d_get64bitmembers) { if(the64bitmembers.first == "cache-bytes" || the64bitmembers.first=="packetcache-bytes") continue; // too slow for 'get-all' diff --git a/pdns/syncres.cc b/pdns/syncres.cc index 1304bd036c..b11ce73c8a 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -58,16 +58,16 @@ unsigned int SyncRes::s_packetcachettl; unsigned int SyncRes::s_packetcacheservfailttl; unsigned int SyncRes::s_serverdownmaxfails; unsigned int SyncRes::s_serverdownthrottletime; -uint64_t SyncRes::s_queries; -uint64_t SyncRes::s_outgoingtimeouts; -uint64_t SyncRes::s_outgoing4timeouts; -uint64_t SyncRes::s_outgoing6timeouts; -uint64_t SyncRes::s_outqueries; -uint64_t SyncRes::s_tcpoutqueries; -uint64_t SyncRes::s_throttledqueries; -uint64_t SyncRes::s_dontqueries; -uint64_t SyncRes::s_nodelegated; -uint64_t SyncRes::s_unreachables; +std::atomic SyncRes::s_queries; +std::atomic SyncRes::s_outgoingtimeouts; +std::atomic SyncRes::s_outgoing4timeouts; +std::atomic SyncRes::s_outgoing6timeouts; +std::atomic SyncRes::s_outqueries; +std::atomic SyncRes::s_tcpoutqueries; +std::atomic SyncRes::s_throttledqueries; +std::atomic SyncRes::s_dontqueries; +std::atomic SyncRes::s_nodelegated; +std::atomic SyncRes::s_unreachables; unsigned int SyncRes::s_minimumTTL; bool SyncRes::s_doIPv6; bool SyncRes::s_nopacketcache; diff --git a/pdns/syncres.hh b/pdns/syncres.hh index b5bc2f9135..cfdb53e496 100644 --- a/pdns/syncres.hh +++ b/pdns/syncres.hh @@ -1,6 +1,7 @@ #ifndef PDNS_SYNCRES_HH #define PDNS_SYNCRES_HH #include +#include #include "utility.hh" #include "dns.hh" #include "qtype.hh" @@ -307,16 +308,16 @@ public: static void doEDNSDumpAndClose(int fd); - static uint64_t s_queries; - static uint64_t s_outgoingtimeouts; - static uint64_t s_outgoing4timeouts; - static uint64_t s_outgoing6timeouts; - static uint64_t s_throttledqueries; - static uint64_t s_dontqueries; - static uint64_t s_outqueries; - static uint64_t s_tcpoutqueries; - static uint64_t s_nodelegated; - static uint64_t s_unreachables; + static std::atomic s_queries; + static std::atomic s_outgoingtimeouts; + static std::atomic s_outgoing4timeouts; + static std::atomic s_outgoing6timeouts; + static std::atomic s_throttledqueries; + static std::atomic s_dontqueries; + static std::atomic s_outqueries; + static std::atomic s_tcpoutqueries; + static std::atomic s_nodelegated; + static std::atomic s_unreachables; static unsigned int s_minimumTTL; static bool s_doIPv6; static unsigned int s_maxqperq; @@ -564,39 +565,39 @@ extern __thread MT_t* MT; struct RecursorStats { - uint64_t servFails; - uint64_t nxDomains; - uint64_t noErrors; - uint64_t answers0_1, answers1_10, answers10_100, answers100_1000, answersSlow; - uint64_t auth4Answers0_1, auth4Answers1_10, auth4Answers10_100, auth4Answers100_1000, auth4AnswersSlow; - uint64_t auth6Answers0_1, auth6Answers1_10, auth6Answers10_100, auth6Answers100_1000, auth6AnswersSlow; + std::atomic servFails; + std::atomic nxDomains; + std::atomic noErrors; + std::atomic answers0_1, answers1_10, answers10_100, answers100_1000, answersSlow; + std::atomic auth4Answers0_1, auth4Answers1_10, auth4Answers10_100, auth4Answers100_1000, auth4AnswersSlow; + std::atomic auth6Answers0_1, auth6Answers1_10, auth6Answers10_100, auth6Answers100_1000, auth6AnswersSlow; double avgLatencyUsec; - uint64_t qcounter; // not increased for unauth packets - uint64_t ipv6qcounter; - uint64_t tcpqcounter; - uint64_t unauthorizedUDP; // when this is increased, qcounter isn't - uint64_t unauthorizedTCP; // when this is increased, qcounter isn't - uint64_t policyDrops; - uint64_t tcpClientOverflow; - uint64_t clientParseError; - uint64_t serverParseError; - uint64_t tooOldDrops; - uint64_t unexpectedCount; - uint64_t caseMismatchCount; - uint64_t spoofCount; - uint64_t resourceLimits; - uint64_t overCapacityDrops; - uint64_t ipv6queries; - uint64_t chainResends; - uint64_t nsSetInvalidations; - uint64_t ednsPingMatches; - uint64_t ednsPingMismatches; - uint64_t noPingOutQueries, noEdnsOutQueries; - uint64_t packetCacheHits; - uint64_t noPacketError; - uint64_t ignoredCount; + std::atomic qcounter; // not increased for unauth packets + std::atomic ipv6qcounter; + std::atomic tcpqcounter; + std::atomic unauthorizedUDP; // when this is increased, qcounter isn't + std::atomic unauthorizedTCP; // when this is increased, qcounter isn't + std::atomic policyDrops; + std::atomic tcpClientOverflow; + std::atomic clientParseError; + std::atomic serverParseError; + std::atomic tooOldDrops; + std::atomic unexpectedCount; + std::atomic caseMismatchCount; + std::atomic spoofCount; + std::atomic resourceLimits; + std::atomic overCapacityDrops; + std::atomic ipv6queries; + std::atomic chainResends; + std::atomic nsSetInvalidations; + std::atomic ednsPingMatches; + std::atomic ednsPingMismatches; + std::atomic noPingOutQueries, noEdnsOutQueries; + std::atomic packetCacheHits; + std::atomic noPacketError; + std::atomic ignoredCount; time_t startupTime; - uint64_t dnssecQueries; + std::atomic dnssecQueries; unsigned int maxMThreadStackUsage; }; -- 2.47.2