]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
more speedups and cleanups for DNSZoneRecord world
authorbert hubert <bert.hubert@netherlabs.nl>
Sun, 4 Sep 2016 19:04:28 +0000 (21:04 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Tue, 13 Sep 2016 10:53:30 +0000 (12:53 +0200)
pdns/dnsbackend.cc
pdns/dnsrecords.hh
pdns/packethandler.cc
pdns/rcpgenerator.cc
pdns/ueberbackend.cc

index c94d5b667081f15825c16d44eb0470c9407747df..403fcf8f412b333bf760a2f9c665cc61927fc68e 100644 (file)
@@ -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"<<endl;
   DNSResourceRecord rr;
   if(!this->get(rr))
     return false;
index f23b2c64fe7ef0cf9d5e36f650190e2921d14c9c..e80e9a139de34aaa97152b4cb76128debc119138 100644 (file)
@@ -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;
 };
index 8f58e46676a4312d2845cdf6b68a183033527a35..8d6fecc58173c0c19e6b108cf13bd8bbb115c94b 100644 (file)
@@ -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<DNSZoneRecord *> arrs=r->getAPRecords();
-    if(arrs.empty()) 
-      return 1;
-
-    DLOG(L<<Logger::Warning<<"This packet needs additional processing!"<<endl);
-
-    vector<DNSZoneRecord> crrs;
+    // we now have a copy, push_back on packet might reallocate!
+    auto& records = r->getRRS();
+    vector<DNSZoneRecord> toAdd;
 
-    for(vector<DNSZoneRecord *>::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<MXRecordContent>(i->dr)->d_mxname;
       else if(i->dr.d_type == QType::SRV)
         lookup = getRR<SRVRecordContent>(i->dr)->d_target;
-
+      else if(i->dr.d_type == QType::NS) 
+        lookup = getRR<NSRecordContent>(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;
 }
index 28edc95f4e26f4fe8f91c3ada46f24c3d92dd07b..942b87cf188f7bc5e4aa521abe01d11cf52c3cd9 100644 (file)
@@ -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;
 }
index fdf1ad68a96165ef0d3b2ead1474165a6219a36f..18853eada3d4b0e1c825e1ee84ba2dfda8642997 100644 (file)
@@ -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("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): uncached"<<endl;
       d_negcached=d_cached=false;
       d_answers.clear(); 
       (d_handle.d_hinterBackend=backends[d_handle.i++])->lookup(qtype, qname,pkt_p,zoneId);
     } 
     else if(cstat==0) {
+      //      cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): NEGcached"<<endl;
       d_negcached=true;
       d_cached=false;
       d_answers.clear();
     }
     else {
+      // cout<<"UeberBackend::lookup("<<qname<<"|"<<DNSRecordContent::NumberToType(qtype.getCode())<<"): CACHED"<<endl;
       d_negcached=false;
       d_cached=true;
       d_cachehandleiter = d_answers.begin();
@@ -579,6 +582,7 @@ void UeberBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disab
 
 bool UeberBackend::get(DNSResourceRecord &rr)
 {
+  // cout<<"UeberBackend::get(DNSResourceRecord&) called, translating to a DNSZoneRecord query"<<endl;
   DNSZoneRecord dzr;
   if(!this->get(dzr))
     return false;
@@ -591,6 +595,7 @@ bool UeberBackend::get(DNSResourceRecord &rr)
 
 bool UeberBackend::get(DNSZoneRecord &rr)
 {
+  // cout<<"UeberBackend::get(DNSZoneRecord) called"<<endl;
   if(d_negcached) {
     return false; 
   }
@@ -603,10 +608,15 @@ bool UeberBackend::get(DNSZoneRecord &rr)
     return false;
   }
   if(!d_handle.get(rr)) {
-    if(!d_ancount && d_handle.qname.countLabels()) // don't cache axfr
+    // cout<<"end of ueberbackend get, seeing if we should cache"<<endl;
+    if(!d_ancount && d_handle.qname.countLabels()) {// don't cache axfr
+      // cout<<"adding negache"<<endl;
       addNegCache(d_question);
-
-    addCache(d_question, d_answers);
+    }
+    else {
+      // cout<<"adding query cache"<<endl;
+      addCache(d_question, d_answers);
+    }
     d_answers.clear();
     return false;
   }