]> granicus.if.org Git - pdns/commitdiff
improve cache hitrate
authorbert hubert <bert.hubert@netherlabs.nl>
Tue, 9 Dec 2014 14:00:52 +0000 (15:00 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Tue, 9 Dec 2014 14:00:52 +0000 (15:00 +0100)
pdns/dns.cc
pdns/recpacketcache.cc

index 42a3cafcd641743bb44e7a4c9aba228acde75383..1678f7072cea578174e57cca4675de020e5e2ec7 100644 (file)
@@ -101,7 +101,7 @@ bool dnspacketLessThan(const std::string& a, const std::string& b)
     int result=0;
     unsigned int n;
     for(n = 0; n < aLabelLen && n < bLabelLen; ++n) 
-      if((result = aSafe[aPos + n] - bSafe[bPos +n]))   // XXX this should perhaps be dns_tolower
+      if((result = dns_tolower(aSafe[aPos + n]) - dns_tolower(bSafe[bPos +n])))
         break;
     // cerr<<"Done loop, result="<<result<<", n = "<<n<<", aLabelLen="<<aLabelLen<<", bLabelLen="<<bLabelLen<<endl;
     if(result < 0)
index d5c3ac41268ed477941478b46110c11b3a3d3d94..c9e89d12b127a24cc76b081ecdce17aea109100c 100644 (file)
@@ -62,6 +62,17 @@ bool RecursorPacketCache::getResponsePacket(const std::string& queryPacket, time
     memcpy(&id, queryPacket.c_str(), 2); 
     *responsePacket = iter->d_packet;
     responsePacket->replace(0, 2, (char*)&id, 2);
+    
+    string::size_type i=sizeof(dnsheader);
+
+    for(;;) {
+      int labellen = (unsigned char)queryPacket[i];
+      if(!labellen || i + labellen > responsePacket->size()) break;
+      i++;
+      responsePacket->replace(i, labellen, queryPacket, i, labellen);
+      i = i + labellen;
+    }
+
     d_hits++;
     moveCacheItemToBack(d_packetCache, iter);