From: Christian Hofstaedtler Date: Mon, 26 Jan 2015 23:51:37 +0000 (+0100) Subject: Split uncached lookup code out of UeberBackend::getSOA X-Git-Tag: dnsdist-1.0.0-alpha1~306^2~1^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79ba7763d94058132268301eeea9ce32bd00a1bf;p=thirdparty%2Fpdns.git Split uncached lookup code out of UeberBackend::getSOA Most callers are using the uncached path, so provide it as a non-hack. --- diff --git a/modules/bindbackend/bindbackend2.cc b/modules/bindbackend/bindbackend2.cc index cbef60a160..74696f0aad 100644 --- a/modules/bindbackend/bindbackend2.cc +++ b/modules/bindbackend/bindbackend2.cc @@ -344,7 +344,6 @@ void Bind2Backend::getAllDomains(vector *domains, bool include_disab } BOOST_FOREACH(DomainInfo &di, *domains) { - soadata.db=(DNSBackend *)-1; // makes getSOA() skip the cache. this->getSOA(di.zone, soadata); di.serial=soadata.serial; } @@ -373,7 +372,6 @@ void Bind2Backend::getUnfreshSlaveInfos(vector *unfreshDomains) SOAData soadata; soadata.refresh=0; soadata.serial=0; - soadata.db=(DNSBackend *)-1; // not sure if this is useful, inhibits any caches that might be around try { getSOA(sd.zone,soadata); // we might not *have* a SOA yet } diff --git a/pdns/dbdnsseckeeper.cc b/pdns/dbdnsseckeeper.cc index 599df7d7ba..10e2e8ce93 100644 --- a/pdns/dbdnsseckeeper.cc +++ b/pdns/dbdnsseckeeper.cc @@ -381,8 +381,7 @@ bool DNSSECKeeper::getPreRRSIGs(UeberBackend& db, const std::string& signer, con // cerr<<"Doing DB lookup for precomputed RRSIGs for '"<<(wildcardname.empty() ? qname : wildcardname)<<"'"< q) // cerr<<"doing per-zone-axfr-acls"<getBackend()->getSOA(q->qdomain,sd)) { + if(s_P->getBackend()->getSOAUncached(q->qdomain,sd)) { // cerr<<"got backend and SOA"< acl; @@ -546,7 +545,6 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr q, int out L<getRemote()< q, int out s_P=new PacketHandler; } - if(!s_P->getBackend()->getSOA(target, sd) || !canDoAXFR(q)) { + if(!s_P->getBackend()->getSOAUncached(target, sd) || !canDoAXFR(q)) { L<setRcode(9); // 'NOTAUTH' sendPacket(outpacket,outsock); @@ -564,17 +562,9 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr q, int out } UeberBackend db; - sd.db=(DNSBackend *)-1; // force uncached answer - if(!db.getSOA(target, sd)) { + if(!db.getSOAUncached(target, sd)) { L<setRcode(9); // 'NOTAUTH' - sendPacket(outpacket,outsock); - return 0; - } - - if(!sd.db || sd.db==(DNSBackend *)-1) { - L<setRcode(RCode::ServFail); + outpacket->setRcode(RCode::NotAuth); sendPacket(outpacket,outsock); return 0; } @@ -975,7 +965,6 @@ int TCPNameserver::doIXFR(shared_ptr q, int outsock) L<qdomain<<"' initiated by "<getRemote()<<" with serial "< q, int outsock) s_P=new PacketHandler; } - if(!s_P->getBackend()->getSOA(q->qdomain, sd) || !canDoAXFR(q)) { + if(!s_P->getBackend()->getSOAUncached(q->qdomain, sd) || !canDoAXFR(q)) { L<qdomain<<"' failed: not authoritative"<setRcode(9); // 'NOTAUTH' sendPacket(outpacket,outsock); @@ -995,17 +984,9 @@ int TCPNameserver::doIXFR(shared_ptr q, int outsock) string target = q->qdomain; UeberBackend db; - sd.db=(DNSBackend *)-1; // force uncached answer - if(!db.getSOA(target, sd)) { + if(!db.getSOAUncached(target, sd)) { L<setRcode(9); // 'NOTAUTH' - sendPacket(outpacket,outsock); - return 0; - } - - if(!sd.db || sd.db==(DNSBackend *)-1) { - L<setRcode(RCode::ServFail); + outpacket->setRcode(RCode::NotAuth); sendPacket(outpacket,outsock); return 0; } diff --git a/pdns/ueberbackend.cc b/pdns/ueberbackend.cc index 777a4f567e..ac523c6517 100644 --- a/pdns/ueberbackend.cc +++ b/pdns/ueberbackend.cc @@ -347,27 +347,34 @@ auth_found: return true; } -/** special trick - if sd.db is set to -1, the cache is ignored */ bool UeberBackend::getSOA(const string &domain, SOAData &sd, DNSPacket *p) { d_question.qtype=QType::SOA; d_question.qname=domain; d_question.zoneId=-1; - if(sd.db!=(DNSBackend *)-1) { - int cstat=cacheHas(d_question,d_answers); - if(cstat==0) { // negative - return false; - } - else if(cstat==1 && !d_answers.empty()) { - fillSOAData(d_answers[0].content,sd); - sd.domain_id=d_answers[0].domain_id; - sd.ttl=d_answers[0].ttl; - sd.db=0; - return true; - } + int cstat=cacheHas(d_question,d_answers); + if(cstat==0) { // negative + return false; } - + else if(cstat==1 && !d_answers.empty()) { + fillSOAData(d_answers[0].content,sd); + sd.domain_id=d_answers[0].domain_id; + sd.ttl=d_answers[0].ttl; + sd.db=0; + return true; + } + + // not found in neg. or pos. cache, look it up + return getSOAUncached(domain, sd, p); +} + +bool UeberBackend::getSOAUncached(const string &domain, SOAData &sd, DNSPacket *p) +{ + d_question.qtype=QType::SOA; + d_question.qname=domain; + d_question.zoneId=-1; + for(vector::const_iterator i=backends.begin();i!=backends.end();++i) if((*i)->getSOA(domain, sd, p)) { if( d_cache_ttl ) { @@ -384,7 +391,7 @@ bool UeberBackend::getSOA(const string &domain, SOAData &sd, DNSPacket *p) return true; } - addNegCache(d_question); + addNegCache(d_question); return false; } diff --git a/pdns/ueberbackend.hh b/pdns/ueberbackend.hh index 86006ab234..d6e1e06f32 100644 --- a/pdns/ueberbackend.hh +++ b/pdns/ueberbackend.hh @@ -104,6 +104,7 @@ public: bool getAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId); bool getSOA(const string &domain, SOAData &sd, DNSPacket *p=0); + bool getSOAUncached(const string &domain, SOAData &sd, DNSPacket *p=0); // same, but ignores cache bool list(const string &target, int domain_id, bool include_disabled=false); bool get(DNSResourceRecord &r); void getAllDomains(vector *domains, bool include_disabled=false); diff --git a/pdns/ws-auth.cc b/pdns/ws-auth.cc index baa35d020c..c62788dce6 100644 --- a/pdns/ws-auth.cc +++ b/pdns/ws-auth.cc @@ -1046,7 +1046,7 @@ static void patchZone(HttpRequest* req, HttpResponse* resp) { BOOST_FOREACH(const DNSResourceRecord& rr, new_ptrs) { DNSPacket fakePacket; SOAData sd; - sd.db = (DNSBackend *)-1; + sd.db = (DNSBackend *)-1; // getAuth() cache bypass fakePacket.qtype = QType::PTR; if (!B.getAuth(&fakePacket, &sd, rr.qname, 0))