From 947908cb565cc4fb72517329a23b76ebd15eeeed Mon Sep 17 00:00:00 2001 From: bert hubert Date: Fri, 2 Nov 2018 11:47:31 +0100 Subject: [PATCH] add some stats to tres plus detect hosts that don't respond --- tdns/tres.cc | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tdns/tres.cc b/tdns/tres.cc index 6fa6107..32d6ef4 100644 --- a/tdns/tres.cc +++ b/tdns/tres.cc @@ -91,6 +91,9 @@ private: } public: unsigned int d_numqueries{0}; + unsigned int d_numtimeouts{0}; + unsigned int d_numformerrs{0}; + }; /** Helper function that extracts a useable IP address from an @@ -119,9 +122,15 @@ static ComboAddress getIP(const std::unique_ptr& rr) */ DNSMessageReader TDNSResolver::getResponse(const ComboAddress& server, const DNSName& dn, const DNSType& dt, int depth) { + static set> skips; std::string prefix(depth, ' '); prefix += dn.toString() + "|"+toString(dt)+" "; + if(skips.count({server,dn,dt})) { + throw std::runtime_error("Skipping query to "+server.toString()+": failed before"); + } + + bool doEDNS=true, doTCP=false; for(int tries = 0; tries < 4 ; ++tries) { @@ -147,6 +156,7 @@ DNSMessageReader TDNSResolver::getResponse(const ComboAddress& server, const DNS int err = waitForData(sock, &timeout); if( err <= 0) { + if(!err) d_numtimeouts++; throw std::runtime_error("Error waiting for data from "+server.toStringWithPort()+": "+ (err ? string(strerror(errno)): string("Timeout"))); } @@ -157,6 +167,7 @@ DNSMessageReader TDNSResolver::getResponse(const ComboAddress& server, const DNS err = waitForData(sock, &timeout); if( err <= 0) { + if(!err) d_numtimeouts++; throw std::runtime_error("Error waiting for data from "+server.toStringWithPort()+": "+ (err ? string(strerror(errno)): string("Timeout"))); } // and even this is not good enough, an authoritative server could be trickling us bytes @@ -171,6 +182,9 @@ DNSMessageReader TDNSResolver::getResponse(const ComboAddress& server, const DNS // so one could simply retry on a timeout, but here we don't if( err <= 0) { + skips.insert({server,dn,dt}); + if(!err) d_numtimeouts++; + throw std::runtime_error("Error waiting for data from "+server.toStringWithPort()+": "+ (err ? string(strerror(errno)): string("Timeout"))); } ComboAddress ign=server; @@ -188,6 +202,7 @@ DNSMessageReader TDNSResolver::getResponse(const ComboAddress& server, const DNS if((RCode)dmr.dh.rcode == RCode::Formerr) { // XXX this should check that there is no OPT in the response lstream() << prefix <<"Got a Formerr, resending without EDNS"< v_cbor = nlohmann::json::to_cbor(jres); FILE* out = fopen("cbor", "w");