#include "namespaces.hh"
__thread MemRecursorCache* t_RC;
-static __thread RecursorPacketCache* t_packetCache;
+__thread RecursorPacketCache* t_packetCache;
RecursorStats g_stats;
bool g_quiet;
void doStats(void)
{
-
+ static time_t lastOutputTime;
+ static uint64_t lastQueryCount;
+
if(g_stats.qcounter && (t_RC->cacheHits + t_RC->cacheMisses) && SyncRes::s_queries && SyncRes::s_outqueries) { // this only runs once thread 0 has had hits
uint64_t cacheHits = broadcastAccFunction<uint64_t>(pleaseGetCacheHits);
uint64_t cacheMisses = broadcastAccFunction<uint64_t>(pleaseGetCacheMisses);
L<<Logger::Warning<<"stats: "<<SyncRes::s_tcpoutqueries<<" outgoing tcp connections, "<<
broadcastAccFunction<uint64_t>(pleaseGetConcurrentQueries)<<" queries running, "<<SyncRes::s_outgoingtimeouts<<" outgoing timeouts"<<endl;
- L<<Logger::Warning<<"stats: "<<g_stats.ednsPingMatches<<" ping matches, "<<g_stats.ednsPingMismatches<<" mismatches, "<<
- g_stats.noPingOutQueries<<" outqueries w/o ping, "<< g_stats.noEdnsOutQueries<<" w/o EDNS"<<endl;
- // L<<Logger::Warning<<"stats: "<<
- // cacheHits <<" packet cache hits ("<<(int)(100.0*cacheHits/SyncRes::s_queries) << "%)"<<endl;
+ //L<<Logger::Warning<<"stats: "<<g_stats.ednsPingMatches<<" ping matches, "<<g_stats.ednsPingMismatches<<" mismatches, "<<
+ //g_stats.noPingOutQueries<<" outqueries w/o ping, "<< g_stats.noEdnsOutQueries<<" w/o EDNS"<<endl;
+
+ L<<Logger::Warning<<"stats: " << broadcastAccFunction<uint64_t>(pleaseGetPacketCacheSize) <<
+ " packet cache entries, "<<(int)(100.0*broadcastAccFunction<uint64_t>(pleaseGetPacketCacheHits)/SyncRes::s_queries) << "% packet cache hits"<<endl;
+
+ time_t now = time(0);
+ if(lastOutputTime && lastQueryCount && now != lastOutputTime) {
+ L<<Logger::Warning<<"stats: "<< (SyncRes::s_queries - lastQueryCount) / (now - lastOutputTime) <<" qps (average over "<< (now - lastOutputTime) << " seconds)"<<endl;
+ }
+ lastOutputTime = now;
+ lastQueryCount = SyncRes::s_queries;
}
else if(statsWanted)
L<<Logger::Warning<<"stats: no stats yet!"<<endl;
}
+
+
+uint64_t* pleaseGetPacketCacheSize()
+{
+ return new uint64_t(t_packetCache->size());
+}
+
+uint64_t doGetPacketCacheSize()
+{
+ return broadcastAccFunction<uint64_t>(pleaseGetPacketCacheSize);
+}
+
+uint64_t* pleaseGetPacketCacheHits()
+{
+ return new uint64_t(t_packetCache->d_hits);
+}
+
+uint64_t doGetPacketCacheHits()
+{
+ return broadcastAccFunction<uint64_t>(pleaseGetPacketCacheHits);
+}
+
+uint64_t* pleaseGetPacketCacheMisses()
+{
+ return new uint64_t(t_packetCache->d_misses);
+}
+
+uint64_t doGetPacketCacheMisses()
+{
+ return broadcastAccFunction<uint64_t>(pleaseGetPacketCacheMisses);
+}
+
+
RecursorControlParser::RecursorControlParser()
{
addGetStat("questions", &g_stats.qcounter);
addGetStat("cache-hits", doGetCacheHits);
addGetStat("cache-misses", doGetCacheMisses);
-
addGetStat("cache-entries", doGetCacheSize);
+
+ addGetStat("packetcache-hits", doGetPacketCacheHits);
+ addGetStat("packetcache-misses", doGetPacketCacheMisses);
+ addGetStat("packetcache-entries", doGetPacketCacheSize);
+
+
+
addGetStat("servfail-answers", &g_stats.servFails);
addGetStat("nxdomain-answers", &g_stats.nxDomains);
addGetStat("noerror-answers", &g_stats.noErrors);
RecursorPacketCache::RecursorPacketCache()
{
+ d_hits = d_misses = 0;
}
bool RecursorPacketCache::getResponsePacket(const std::string& queryPacket, time_t now, std::string* responsePacket)
uint16_t id = ((struct dnsheader*)queryPacket.c_str())->id;
*responsePacket = iter->d_packet;
((struct dnsheader*)responsePacket->c_str())->id=id;
+ d_hits++;
return true;
}
+ d_misses++;
return false;
}
d_packetCache.insert(e);
}
-
+uint64_t RecursorPacketCache::size()
+{
+ return d_packetCache.size();
+}
void insertResponsePacket(const std::string& responsePacket, time_t now, uint32_t ttd);
void prune();
+ uint64_t d_hits, d_misses;
+ uint64_t size();
+
private:
struct Entry
#include <boost/utility.hpp>
#include "sstuff.hh"
#include "recursor_cache.hh"
+#include "recpacketcache.hh"
#include <boost/tuple/tuple.hpp>
#include <boost/optional.hpp>
#include <boost/tuple/tuple_comparison.hpp>
void primeHints(void);
-
-
struct NegCacheEntry
{
string d_name;
}
};
extern __thread MemRecursorCache* t_RC;
+extern __thread RecursorPacketCache* t_packetCache;
typedef MTasker<PacketID,string> MT_t;
extern __thread MT_t* MT;
uint64_t* pleaseGetCacheMisses();
uint64_t* pleaseGetConcurrentQueries();
uint64_t* pleaseGetThrottleSize();
+uint64_t* pleaseGetPacketCacheHits();
+uint64_t* pleaseGetPacketCacheSize();
+
#endif