]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Split uncached lookup code out of UeberBackend::getSOA
authorChristian Hofstaedtler <christian@hofstaedtler.name>
Mon, 26 Jan 2015 23:51:37 +0000 (00:51 +0100)
committerChristian Hofstaedtler <christian@hofstaedtler.name>
Sun, 1 Feb 2015 13:55:23 +0000 (14:55 +0100)
Most callers are using the uncached path, so provide it as a non-hack.

modules/bindbackend/bindbackend2.cc
pdns/dbdnsseckeeper.cc
pdns/packethandler.cc
pdns/pdnssec.cc
pdns/tcpreceiver.cc
pdns/ueberbackend.cc
pdns/ueberbackend.hh
pdns/ws-auth.cc

index cbef60a160d0201f5a3c6880d8ee5b622e7775ff..74696f0aad79a7b683470c55f5fdd36936cefbcf 100644 (file)
@@ -344,7 +344,6 @@ void Bind2Backend::getAllDomains(vector<DomainInfo> *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<DomainInfo> *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
     }
index 599df7d7ba9bd0219c7d96218637924b79f407f6..10e2e8ce935a8a1c85be684391aa07f5cd60da10 100644 (file)
@@ -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)<<"'"<<endl;
         SOAData sd;
-        sd.db=(DNSBackend *)-1; // force uncached answer
-        if(!db.getSOA(signer, sd)) {
+        if(!db.getSOAUncached(signer, sd)) {
                 DLOG(L<<"Could not get SOA for domain"<<endl);
                 return false;
         }
index 6332173bd587f94ca2d4d24916a778cb20ca3b33..2a0833dbb0200dcc337f1d07dd783fa68640f88a 100644 (file)
@@ -544,8 +544,7 @@ void PacketHandler::addNSEC3(DNSPacket *p, DNSPacket *r, const string& target, c
   DLOG(L<<"addNSEC3() mode="<<mode<<" auth="<<auth<<" target="<<target<<" wildcard="<<wildcard<<endl);
 
   SOAData sd;
-  sd.db = (DNSBackend*)-1; // force uncached answer
-  if(!B.getSOA(auth, sd)) {
+  if(!B.getSOAUncached(auth, sd)) {
     DLOG(L<<"Could not get SOA for domain");
     return;
   }
@@ -638,8 +637,7 @@ void PacketHandler::addNSEC(DNSPacket *p, DNSPacket *r, const string& target, co
   DLOG(L<<"addNSEC() mode="<<mode<<" auth="<<auth<<" target="<<target<<" wildcard="<<wildcard<<endl);
 
   SOAData sd;
-  sd.db=(DNSBackend *)-1; // force uncached answer
-  if(!B.getSOA(auth, sd)) {
+  if(!B.getSOAUncached(auth, sd)) {
     DLOG(L<<"Could not get SOA for domain"<<endl);
     return;
   }
index 221eeef46b3842347442307769112a7fc22cbe0f..99ac43d5befd6169347dd1a436aad966a615fcbe 100644 (file)
@@ -184,9 +184,8 @@ bool rectifyZone(DNSSECKeeper& dk, const std::string& zone)
   UeberBackend B("default");
   bool doTransaction=true; // but see above
   SOAData sd;
-  sd.db = (DNSBackend*)-1;
 
-  if(!B.getSOA(zone, sd)) {
+  if(!B.getSOAUncached(zone, sd)) {
     cerr<<"No SOA known for '"<<zone<<"', is such a zone in the database?"<<endl;
     return false;
   }
@@ -401,8 +400,7 @@ void rectifyAllZones(DNSSECKeeper &dk)
 int checkZone(DNSSECKeeper &dk, UeberBackend &B, const std::string& zone)
 {
   SOAData sd;
-  sd.db=(DNSBackend*)-1;
-  if(!B.getSOA(zone, sd)) {
+  if(!B.getSOAUncached(zone, sd)) {
     cout<<"[error] No SOA record present, or active, in zone '"<<zone<<"'"<<endl;
     cout<<"Checked 0 records of '"<<zone<<"', 1 errors, 0 warnings."<<endl;
     return 1;
@@ -613,8 +611,7 @@ int increaseSerial(const string& zone, DNSSECKeeper &dk)
 {
   UeberBackend B("default");
   SOAData sd;
-  sd.db=(DNSBackend*)-1;
-  if(!B.getSOA(zone, sd)) {
+  if(!B.getSOAUncached(zone, sd)) {
     cout<<"No SOA for zone '"<<zone<<"'"<<endl;
     return -1;
   }
index 6356d343b8432ae146172e7a4ca7285d0784380b..535e005bfcfd776b222e8caef78db9aa9ec04d8e 100644 (file)
@@ -424,8 +424,7 @@ bool TCPNameserver::canDoAXFR(shared_ptr<DNSPacket> q)
 
   // cerr<<"doing per-zone-axfr-acls"<<endl;
   SOAData sd;
-  sd.db=(DNSBackend *)-1;
-  if(s_P->getBackend()->getSOA(q->qdomain,sd)) {
+  if(s_P->getBackend()->getSOAUncached(q->qdomain,sd)) {
     // cerr<<"got backend and SOA"<<endl;
     DNSBackend *B=sd.db;
     vector<string> acl;
@@ -546,7 +545,6 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
   L<<Logger::Error<<"AXFR of domain '"<<target<<"' initiated by "<<q->getRemote()<<endl;
 
   SOAData sd;
-  sd.db=(DNSBackend *)-1; // force uncached answer
   {
     Lock l(&s_plock);
     DLOG(L<<"Looking for SOA"<<endl);    // find domain_id via SOA and list complete domain. No SOA, no AXFR
@@ -555,7 +553,7 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> 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<<Logger::Error<<"AXFR of domain '"<<target<<"' failed: not authoritative"<<endl;
       outpacket->setRcode(9); // 'NOTAUTH'
       sendPacket(outpacket,outsock);
@@ -564,17 +562,9 @@ int TCPNameserver::doAXFR(const string &target, shared_ptr<DNSPacket> q, int out
   }
  
   UeberBackend db;
-  sd.db=(DNSBackend *)-1; // force uncached answer
-  if(!db.getSOA(target, sd)) {
+  if(!db.getSOAUncached(target, sd)) {
     L<<Logger::Error<<"AXFR of domain '"<<target<<"' failed: not authoritative in second instance"<<endl;
-    outpacket->setRcode(9); // 'NOTAUTH'
-    sendPacket(outpacket,outsock);
-    return 0;
-  }
-
-  if(!sd.db || sd.db==(DNSBackend *)-1) {
-    L<<Logger::Error<<"Error determining backend for domain '"<<target<<"' trying to serve an AXFR"<<endl;
-    outpacket->setRcode(RCode::ServFail);
+    outpacket->setRcode(RCode::NotAuth);
     sendPacket(outpacket,outsock);
     return 0;
   }
@@ -975,7 +965,6 @@ int TCPNameserver::doIXFR(shared_ptr<DNSPacket> q, int outsock)
   L<<Logger::Error<<"IXFR of domain '"<<q->qdomain<<"' initiated by "<<q->getRemote()<<" with serial "<<serial<<endl;
 
   SOAData sd;
-  sd.db=(DNSBackend *)-1; // force uncached answer
   {
     Lock l(&s_plock);
     DLOG(L<<"Looking for SOA"<<endl); // find domain_id via SOA and list complete domain. No SOA, no IXFR
@@ -984,7 +973,7 @@ int TCPNameserver::doIXFR(shared_ptr<DNSPacket> 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<<Logger::Error<<"IXFR of domain '"<<q->qdomain<<"' failed: not authoritative"<<endl;
       outpacket->setRcode(9); // 'NOTAUTH'
       sendPacket(outpacket,outsock);
@@ -995,17 +984,9 @@ int TCPNameserver::doIXFR(shared_ptr<DNSPacket> 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<<Logger::Error<<"IXFR of domain '"<<target<<"' failed: not authoritative in second instance"<<endl;
-    outpacket->setRcode(9); // 'NOTAUTH'
-    sendPacket(outpacket,outsock);
-    return 0;
-  }
-
-  if(!sd.db || sd.db==(DNSBackend *)-1) {
-    L<<Logger::Error<<"Error determining backend for domain '"<<target<<"' trying to serve an IXFR"<<endl;
-    outpacket->setRcode(RCode::ServFail);
+    outpacket->setRcode(RCode::NotAuth);
     sendPacket(outpacket,outsock);
     return 0;
   }
index 777a4f567ef614e41ed5626c7e18566977fdb91c..ac523c6517077de8f3c56e983f5b240b68f24e5b 100644 (file)
@@ -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<DNSBackend *>::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;
 }
 
index 86006ab2348a0323f9976a1bc1e53686bbf9cecc..d6e1e06f3269fdd2334537851abc9e683caa308a 100644 (file)
@@ -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<DomainInfo> *domains, bool include_disabled=false);
index baa35d020ca530c88ac238121858c7beb198acf0..c62788dce6ad6a4267b922b5bbeb0e273700e411 100644 (file)
@@ -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))