struct timeval g_now;
typedef vector<int> tcpserversocks_t;
-typedef MTasker<PacketID,string> MT_t;
-MT_t* MT;
-
+MT_t* MT; // the big MTasker
void handleTCPClientWritable(int fd, boost::any& var);
}
try {
DNSComboWriter* dc = new DNSComboWriter(data, len, g_now);
-
dc->setRemote(&fromaddr);
if(dc->d_mdp.d_header.qr) {
MT->makeThread(houseKeeping,0);
}
- if(!(counter%11)) {
+ if(!(counter%55)) {
typedef vector<pair<int, boost::any> > expired_t;
expired_t expired=g_fdm->getTimeouts(g_now);
-
#include "utility.hh"
#include "rec_channel.hh"
#include <boost/lexical_cast.hpp>
#include <sys/stat.h>
#include <fcntl.h>
#include "logger.hh"
+#include "dnsparser.hh"
#ifndef WIN32
#include <sys/resource.h>
#include <sys/time.h>
}
#endif
+static string doCurrentQueries()
+{
+ ostringstream ostr;
+
+ ostr << MT->d_waiters.size() <<" currently outstanding questions\n";
+
+ boost::format fmt("%1% %|40t|%2% %|47t|%3% %|63t|%4% %|68t|%5%\n");
+
+ ostr << (fmt % "qname" % "qtype" % "remote" % "tcp" % "chained");
+ int n=0;
+ for(MT_t::waiters_t::iterator mthread=MT->d_waiters.begin(); mthread!=MT->d_waiters.end() && n < 100; ++mthread, ++n) {
+ const PacketID& pident = mthread->key;
+ ostr << (fmt
+ % pident.domain % DNSRecordContent::NumberToType(pident.type)
+ % pident.remote.toString() % (pident.sock ? 'Y' : 'n')
+ % (pident.fd == -1 ? 'Y' : 'n')
+ );
+ }
+ ostr <<" - done\n";
+ return ostr.str();
+}
+
RecursorControlParser::RecursorControlParser()
{
addGetStat("questions", &g_stats.qcounter);
if(cmd=="top-remotes")
return doTopRemotes();
+ if(cmd=="current-queries")
+ return doCurrentQueries();
+
if(cmd=="ping")
return "pong\n";
}
};
extern MemRecursorCache RC;
-extern MTasker<PacketID,string>* MT;
+typedef MTasker<PacketID,string> MT_t;
+extern MT_t* MT;
struct RecursorStats
{