From aa7b24056ac957241ec39dd8d17c17b0dd38379b Mon Sep 17 00:00:00 2001 From: bert hubert Date: Sun, 4 Sep 2016 21:04:28 +0200 Subject: [PATCH] more speedups and cleanups for DNSZoneRecord world --- pdns/dnsbackend.cc | 1 + pdns/dnsrecords.hh | 2 +- pdns/packethandler.cc | 27 ++++++++++++++------------- pdns/rcpgenerator.cc | 2 +- pdns/ueberbackend.cc | 16 +++++++++++++--- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/pdns/dnsbackend.cc b/pdns/dnsbackend.cc index c94d5b667..403fcf8f4 100644 --- a/pdns/dnsbackend.cc +++ b/pdns/dnsbackend.cc @@ -265,6 +265,7 @@ bool DNSBackend::getSOA(const DNSName &domain, SOAData &sd, DNSPacket *p) bool DNSBackend::get(DNSZoneRecord& dzr) { + // cout<<"DNSBackend::get(DNSZoneRecord&) called - translating into DNSResourceRecord query"<get(rr)) return false; diff --git a/pdns/dnsrecords.hh b/pdns/dnsrecords.hh index f23b2c64f..e80e9a139 100644 --- a/pdns/dnsrecords.hh +++ b/pdns/dnsrecords.hh @@ -179,7 +179,7 @@ class NSRecordContent : public DNSRecordContent public: includeboilerplate(NS) explicit NSRecordContent(const DNSName& content) : d_content(content){} - DNSName getNS() const { return d_content; } + const DNSName& getNS() const { return d_content; } private: DNSName d_content; }; diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 8f58e4667..8d6fecc58 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -388,19 +388,15 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c sd.db=0; if(p->qtype.getCode()!=QType::AXFR) { // this packet needs additional processing - vector arrs=r->getAPRecords(); - if(arrs.empty()) - return 1; - - DLOG(L< crrs; + // we now have a copy, push_back on packet might reallocate! + auto& records = r->getRRS(); + vector toAdd; - for(vector::const_iterator i=arrs.begin(); i!=arrs.end(); ++i) - crrs.push_back(**i); + for(auto i = records.cbegin() ; i!= records.cend(); ++i) { + if(i->dr.d_place==DNSResourceRecord::ADDITIONAL || + !(i->dr.d_type==QType::MX || i->dr.d_type==QType::NS || i->dr.d_type==QType::SRV)) + continue; - // we now have a copy, push_back on packet might reallocate! - for(auto i=crrs.cbegin(); i!=crrs.cend(); ++i) { if(r->d.aa && i->dr.d_name.countLabels() && i->dr.d_type==QType::NS && !B.getSOA(i->dr.d_name,sd,p) && !retargeted) { // drop AA in case of non-SOA-level NS answer, except for root referral r->setA(false); // i->d_place=DNSResourceRecord::AUTHORITY; // XXX FIXME @@ -412,7 +408,10 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c lookup = getRR(i->dr)->d_mxname; else if(i->dr.d_type == QType::SRV) lookup = getRR(i->dr)->d_target; - + else if(i->dr.d_type == QType::NS) + lookup = getRR(i->dr)->getNS(); + else + continue; B.lookup(QType(d_doIPv6AdditionalProcessing ? QType::ANY : QType::A), lookup, p); while(B.get(rr)) { @@ -426,9 +425,11 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c if(rr.auth && !rr.dr.d_name.isPartOf(soadata.qname)) // don't sign out of zone data using the main key rr.auth=false; rr.dr.d_place=DNSResourceRecord::ADDITIONAL; - r->addRecord(rr); + toAdd.push_back(rr); } } + // records.reserve(records.size()+toAdd.size()); + records.insert(records.end(), toAdd.cbegin(), toAdd.cend()); } return 1; } diff --git a/pdns/rcpgenerator.cc b/pdns/rcpgenerator.cc index 28edc95f4..942b87cf1 100644 --- a/pdns/rcpgenerator.cc +++ b/pdns/rcpgenerator.cc @@ -66,7 +66,7 @@ void RecordTextReader::xfr32BitInt(uint32_t &val) throw RecordTextException("expected digits at position "+std::to_string(d_pos)+" in '"+d_string+"'"); size_t pos; - val=pdns_stou(d_string.substr(d_pos), &pos); + val=pdns_stou(d_string.c_str()+d_pos, &pos); d_pos += pos; } diff --git a/pdns/ueberbackend.cc b/pdns/ueberbackend.cc index fdf1ad68a..18853eada 100644 --- a/pdns/ueberbackend.cc +++ b/pdns/ueberbackend.cc @@ -551,16 +551,19 @@ void UeberBackend::lookup(const QType &qtype,const DNSName &qname, DNSPacket *pk d_question.zoneId=zoneId; int cstat=cacheHas(d_question, d_answers); if(cstat<0) { // nothing + // cout<<"UeberBackend::lookup("<lookup(qtype, qname,pkt_p,zoneId); } else if(cstat==0) { + // cout<<"UeberBackend::lookup("< *domains, bool include_disab bool UeberBackend::get(DNSResourceRecord &rr) { + // cout<<"UeberBackend::get(DNSResourceRecord&) called, translating to a DNSZoneRecord query"<get(dzr)) return false; @@ -591,6 +595,7 @@ bool UeberBackend::get(DNSResourceRecord &rr) bool UeberBackend::get(DNSZoneRecord &rr) { + // cout<<"UeberBackend::get(DNSZoneRecord) called"<