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;
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;
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();
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'
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;
#ifndef PDNS_SYNCRES_HH
#define PDNS_SYNCRES_HH
#include <string>
+#include <atomic>
#include "utility.hh"
#include "dns.hh"
#include "qtype.hh"
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;
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;
};