* Function that creates all the stats
* when udpOrTCP is true, it is udp
*/
-void ResponseStats::submitResponse(DNSPacket &p, bool udpOrTCP, bool last) {
+void ResponseStats::submitResponse(DNSPacket &p, bool udpOrTCP, bool last) const {
const string& buf=p.getString();
static AtomicCounter &udpnumanswered=*S.getPointer("udp-answers");
static AtomicCounter &udpnumanswered4=*S.getPointer("udp4-answers");
d_sizecounters("SizeCounters", sizeBounds())
{
for (unsigned int n = 0; n < 65535; ++n) {
- d_qtypecounters[n] = 0;
+ d_qtypecounters[n].value = 0;
}
for (unsigned int n = 0; n < 256; ++n) {
- d_rcodecounters[n] = 0;
+ d_rcodecounters[n].value = 0;
}
}
ResponseStats g_rs;
-void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP)
+void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP) const
{
- d_rcodecounters.at(rcode)++;
+ d_rcodecounters.at(rcode).value++;
submitResponse(qtype, respsize, udpOrTCP);
}
-void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP)
+void ResponseStats::submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP) const
{
- d_qtypecounters.at(qtype)++;
+ d_qtypecounters.at(qtype).value++;
d_sizecounters(respsize);
}
map<uint16_t, uint64_t> ret;
uint64_t count;
for (unsigned int i = 0; i < 65535; ++i) {
- count = d_qtypecounters.at(i);
+ count = d_qtypecounters.at(i).value;
if (count) {
ret[i] = count;
}
map<uint8_t, uint64_t> ret;
uint64_t count;
for (unsigned int i = 0; i < 256; ++i) {
- count = d_rcodecounters.at(i);
+ count = d_rcodecounters.at(i).value;
if (count) {
ret[i] = count;
}
public:
ResponseStats();
- void submitResponse(DNSPacket& p, bool udpOrTCP, bool last = true);
- void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP);
- void submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP);
+ void submitResponse(DNSPacket& p, bool udpOrTCP, bool last = true) const;
+ void submitResponse(uint16_t qtype, uint16_t respsize, bool udpOrTCP) const;
+ void submitResponse(uint16_t qtype, uint16_t respsize, uint8_t rcode, bool udpOrTCP) const;
map<uint16_t, uint64_t> getQTypeResponseCounts() const;
map<uint16_t, uint64_t> getSizeResponseCounts() const;
map<uint8_t, uint64_t> getRCodeResponseCounts() const;
string getQTypeReport() const;
private:
- std::array<std::atomic<uint64_t>, 65535> d_qtypecounters;
- std::array<std::atomic<uint64_t>, 256> d_rcodecounters;
+ struct Counter
+ {
+ mutable std::atomic<uint64_t> value;
+ };
+
+ std::array<Counter, 65535> d_qtypecounters;
+ std::array<Counter, 256> d_rcodecounters;
pdns::AtomicHistogram<uint64_t> d_sizecounters;
};