]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
make the recursor counters atomic, closes #1747 3527/head
authorbert hubert <bert.hubert@powerdns.com>
Mon, 7 Mar 2016 20:09:02 +0000 (21:09 +0100)
committerbert hubert <bert.hubert@powerdns.com>
Mon, 7 Mar 2016 20:09:02 +0000 (21:09 +0100)
pdns/rec_channel_rec.cc
pdns/syncres.cc
pdns/syncres.hh

index 90e5851bda1d4f34fddf0ce1b4092788f1208fa9..6e94c88d10b1d977683c36a9855abf677600ba4c 100644 (file)
@@ -36,6 +36,7 @@ pthread_mutex_t g_carbon_config_lock=PTHREAD_MUTEX_INITIALIZER;
 
 map<string, const uint32_t*> d_get32bitpointers;
 map<string, const uint64_t*> d_get64bitpointers;
+map<string, const std::atomic<uint64_t>*> d_getatomics;
 map<string, function< uint64_t() > >  d_get64bitmembers;
 pthread_mutex_t d_dynmetricslock = PTHREAD_MUTEX_INITIALIZER;
 map<string, std::atomic<unsigned long>* > 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<uint64_t>* place)
+{
+  d_getatomics[name]=place;
+}
+
+
 void addGetStat(const string& name, function<uint64_t ()> f ) 
 {
   d_get64bitmembers[name]=f;
@@ -74,6 +81,8 @@ optional<uint64_t> 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<string,string> 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'
index 1304bd036ccdcc42459ab38fa8351ced58090764..b11ce73c8a5e3beb67c5712777f088dec43cac12 100644 (file)
@@ -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<uint64_t> SyncRes::s_queries;
+std::atomic<uint64_t> SyncRes::s_outgoingtimeouts;
+std::atomic<uint64_t> SyncRes::s_outgoing4timeouts;
+std::atomic<uint64_t> SyncRes::s_outgoing6timeouts;
+std::atomic<uint64_t> SyncRes::s_outqueries;
+std::atomic<uint64_t> SyncRes::s_tcpoutqueries;
+std::atomic<uint64_t> SyncRes::s_throttledqueries;
+std::atomic<uint64_t> SyncRes::s_dontqueries;
+std::atomic<uint64_t> SyncRes::s_nodelegated;
+std::atomic<uint64_t> SyncRes::s_unreachables;
 unsigned int SyncRes::s_minimumTTL;
 bool SyncRes::s_doIPv6;
 bool SyncRes::s_nopacketcache;
index b5bc2f9135c30db6cda09ea32458307a088b1b0d..cfdb53e4961693a1f858e67e81fbf7aa6b141525 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef PDNS_SYNCRES_HH
 #define PDNS_SYNCRES_HH
 #include <string>
+#include <atomic>
 #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<uint64_t> s_queries;
+  static std::atomic<uint64_t> s_outgoingtimeouts;
+  static std::atomic<uint64_t> s_outgoing4timeouts;
+  static std::atomic<uint64_t> s_outgoing6timeouts;
+  static std::atomic<uint64_t> s_throttledqueries;
+  static std::atomic<uint64_t> s_dontqueries;
+  static std::atomic<uint64_t> s_outqueries;
+  static std::atomic<uint64_t> s_tcpoutqueries;
+  static std::atomic<uint64_t> s_nodelegated;
+  static std::atomic<uint64_t> 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<uint64_t> servFails;
+  std::atomic<uint64_t> nxDomains;
+  std::atomic<uint64_t> noErrors;
+  std::atomic<uint64_t> answers0_1, answers1_10, answers10_100, answers100_1000, answersSlow;
+  std::atomic<uint64_t> auth4Answers0_1, auth4Answers1_10, auth4Answers10_100, auth4Answers100_1000, auth4AnswersSlow;
+  std::atomic<uint64_t> 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<uint64_t> qcounter;     // not increased for unauth packets
+  std::atomic<uint64_t> ipv6qcounter;
+  std::atomic<uint64_t> tcpqcounter;
+  std::atomic<uint64_t> unauthorizedUDP;  // when this is increased, qcounter isn't
+  std::atomic<uint64_t> unauthorizedTCP;  // when this is increased, qcounter isn't
+  std::atomic<uint64_t> policyDrops;
+  std::atomic<uint64_t> tcpClientOverflow;
+  std::atomic<uint64_t> clientParseError;
+  std::atomic<uint64_t> serverParseError;
+  std::atomic<uint64_t> tooOldDrops;
+  std::atomic<uint64_t> unexpectedCount;
+  std::atomic<uint64_t> caseMismatchCount;
+  std::atomic<uint64_t> spoofCount;
+  std::atomic<uint64_t> resourceLimits;
+  std::atomic<uint64_t> overCapacityDrops;
+  std::atomic<uint64_t> ipv6queries;
+  std::atomic<uint64_t> chainResends;
+  std::atomic<uint64_t> nsSetInvalidations;
+  std::atomic<uint64_t> ednsPingMatches;
+  std::atomic<uint64_t> ednsPingMismatches;
+  std::atomic<uint64_t> noPingOutQueries, noEdnsOutQueries;
+  std::atomic<uint64_t> packetCacheHits;
+  std::atomic<uint64_t> noPacketError;
+  std::atomic<uint64_t> ignoredCount;
   time_t startupTime;
-  uint64_t dnssecQueries;
+  std::atomic<uint64_t> dnssecQueries;
   unsigned int maxMThreadStackUsage;
 };