Most callers are using the uncached path, so provide it as a non-hack.
}
BOOST_FOREACH(DomainInfo &di, *domains) {
- soadata.db=(DNSBackend *)-1; // makes getSOA() skip the cache.
this->getSOA(di.zone, soadata);
di.serial=soadata.serial;
}
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
}
// 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;
}
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;
}
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;
}
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;
}
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;
{
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;
}
// 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;
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
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);
}
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;
}
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
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);
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;
}
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 ) {
return true;
}
- addNegCache(d_question);
+ addNegCache(d_question);
return false;
}
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);
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))