Changeset 1433

Show
Ignore:
Timestamp:
10/13/09 21:33:08 (5 months ago)
Author:
ahu
Message:

add simple packetcache to recursor (thread safe)

Location:
trunk/pdns/pdns
Files:
3 added
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/pdns/Makefile.am

    r1401 r1433  
    3030session.cc session.hh misc.cc misc.hh receiver.cc ueberbackend.cc \ 
    3131dynlistener.cc dynlistener.hh  dynhandler.cc dynhandler.hh  \ 
    32 resolver.hh resolver.cc communicator.cc communicator.hh dnsproxy.cc \ 
     32resolver.hh resolver.cc slavecommunicator.cc mastercommunicator.cc communicator.hh dnsproxy.cc \ 
    3333dnsproxy.hh randombackend.cc unix_utility.cc common_startup.cc \ 
    3434utility.hh iputils.hh common_startup.hh unix_semaphore.cc \ 
     
    4242aes/aescrypt.c aes/aes.h aes/aeskey.c aes/aes_modes.c aes/aesopt.h \ 
    4343aes/aestab.c aes/aestab.h aes/brg_endian.h aes/brg_types.h aes/dns_random.cc \ 
    44 randomhelper.cc 
     44randomhelper.cc  
    4545 
    4646# 
     
    127127rec_channel_rec.cc selectmplexer.cc epollmplexer.cc sillyrecords.cc htimer.cc htimer.hh \ 
    128128aes/dns_random.cc aes/aescrypt.c aes/aeskey.c aes/aestab.c aes/aes_modes.c \ 
    129 lua-pdns-recursor.cc lua-pdns-recursor.hh randomhelper.cc 
     129lua-pdns-recursor.cc lua-pdns-recursor.hh randomhelper.cc  \ 
     130recpacketcache.cc recpacketcache.hh dns.cc 
    130131 
    131132if NEDMALLOC 
  • trunk/pdns/pdns/dist-recursor

    r1424 r1433  
    77mplexer.hh win32_mtasker.hh win32_utility.cc ntservice.hh singleton.hh \ 
    88recursorservice.hh dns_random.hh lua-pdns-recursor.hh namespaces.hh \ 
    9 md5.hh" 
     9recpacketcache.hh" 
    1010 
    1111CFILES="syncres.cc  misc.cc unix_utility.cc qtype.cc \ 
     
    1616win32_mtasker.cc win32_rec_channel.cc win32_logger.cc ntservice.cc \ 
    1717recursorservice.cc sillyrecords.cc lua-pdns-recursor.cc randomhelper.cc \ 
    18 md5.cc devpollmplexer.cc" 
     18devpollmplexer.cc recpacketcache.cc dns.cc" 
    1919 
    2020cd docs 
  • trunk/pdns/pdns/dns.hh

    r1273 r1433  
    249249#define L theL() 
    250250extern time_t s_starttime; 
    251  
    252 #endif 
     251std::string questionExpand(const char* packet, uint16_t len, uint16_t& type); 
     252#endif 
  • trunk/pdns/pdns/pdns_recursor.cc

    r1430 r1433  
    2626 
    2727#include <boost/foreach.hpp> 
     28#include "recpacketcache.hh" 
    2829#include "utility.hh"  
    2930#include "dns_random.hh" 
    30 #include "md5.hh" 
    3131#include <iostream> 
    3232#include <errno.h> 
     
    7474bool g_logCommonErrors; 
    7575shared_ptr<PowerDNSLua> g_pdl; 
     76RecursorPacketCache g_packetCache; 
     77 
    7678#include "namespaces.hh" 
    7779 
     
    8082#include <semaphore.h> 
    8183#endif 
    82 map<string, string> g_packetCache; 
     84 
    8385 
    8486MemRecursorCache RC; 
     
    9597map<int, ComboAddress> g_listenSocketsAddresses; // is shared across all threads right now 
    9698struct DNSComboWriter { 
    97   DNSComboWriter(const char* data, uint16_t len, const std::string& hash, const struct timeval& now) : d_mdp(data, len), d_now(now),  
    98                                                                                                        d_hash(hash), d_tcp(false), d_socket(-1) 
     99  DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(data, len), d_now(now),  
     100                                                                                                        d_tcp(false), d_socket(-1) 
    99101  {} 
    100102  MOADNSParser d_mdp; 
     
    116118  struct timeval d_now; 
    117119  ComboAddress d_remote; 
    118   string d_hash; 
    119120  bool d_tcp; 
    120121  int d_socket; 
     
    603604       } 
    604605    } 
     606    uint32_t minTTL=numeric_limits<uint32_t>::max(); 
    605607    if(res<0) { 
    606608      pw.getHeader()->rcode=RCode::ServFail; 
     
    622624      } 
    623625       
     626 
    624627      if(ret.size()) { 
    625628        shuffle(ret); 
     
    628631        for(vector<DNSResourceRecord>::const_iterator i=ret.begin(); i!=ret.end(); ++i) { 
    629632          pw.startRecord(i->qname, i->qtype.getCode(), i->ttl, i->qclass, (DNSPacketWriter::Place)i->d_place);  
    630            
     633          minTTL = min(minTTL, i->ttl); 
    631634          if(i->qtype.getCode() == QType::A) { // blast out A record w/o doing whole dnswriter thing 
    632635            uint32_t ip=0; 
     
    651654    if(!dc->d_tcp) { 
    652655      sendto(dc->d_socket, (const char*)&*packet.begin(), packet.size(), 0, (struct sockaddr *)(&dc->d_remote), dc->d_remote.getSocklen()); 
    653       if(pw.getHeader()->rcode==RCode::NoError || pw.getHeader()->rcode==RCode::NXDomain ) 
    654         g_packetCache[dc->d_hash]=string((const char*)&*packet.begin(), packet.size()); 
    655       else  
    656         ; //    cerr<<"rcode:" <<(int)pw.getHeader()->rcode<<endl; 
     656      g_packetCache.insertResponsePacket(string((const char*)&*packet.begin(), packet.size()), g_now.tv_sec,  
     657                                         min(minTTL,  
     658                                             pw.getHeader()->rcode == RCode::ServFail ? (uint32_t)60 : (uint32_t) 3600 
     659                                             ) 
     660                                         ); 
    657661    } 
    658662    else { 
     
    800804      DNSComboWriter* dc=0; 
    801805      try { 
    802         dc=new DNSComboWriter(tconn.data, tconn.qlen, string(), g_now); 
     806        dc=new DNSComboWriter(tconn.data, tconn.qlen, g_now); 
    803807      } 
    804808      catch(MOADNSException &mde) { 
     
    867871} 
    868872  
    869 void questionExpand(const char* packet, uint16_t len, char* qname, int maxlen, uint16_t& type) 
    870 { 
    871   type=0; 
    872   const unsigned char* end=(const unsigned char*)packet+len; 
    873   unsigned char* lbegin=(unsigned char*)packet+12; 
    874   unsigned char* pos=lbegin; 
    875   unsigned char labellen; 
    876  
    877   // 3www4ds9a2nl0 
    878   char *dst=qname; 
    879   char* lend=dst + maxlen; 
    880    
    881   if(!*pos) 
    882     *dst++='.'; 
    883  
    884   while((labellen=*pos++) && pos < end) { // "scan and copy" 
    885     if(dst >= lend) 
    886       throw runtime_error("Label length exceeded destination length"); 
    887     for(;labellen;--labellen) 
    888       *dst++ = *pos++; 
    889     *dst++='.'; 
    890   } 
    891   *dst=0; 
    892  
    893   if(pos + labellen + 2 <= end)  // is this correct XXX FIXME? 
    894     type=(*pos)*256 + *(pos+1); 
    895  
    896  
    897   //  cerr<<"Returning: '"<< string(tmp+1, pos) <<"'\n"; 
    898 } 
    899  
    900 string questionExpand(const char* packet, uint16_t len, uint16_t& type) 
    901 { 
    902   char tmp[512]; 
    903   questionExpand(packet, len, tmp, sizeof(tmp), type); 
    904   return tmp; 
    905 } 
    906873 
    907874 
     
    936903      else { 
    937904        ++g_stats.qcounter; 
    938         uint16_t tmp = dh->id; 
    939         dh->id=0; 
    940          
    941         MD5Summer md5s; 
    942         md5s.feed(data, len); 
    943         string hash = md5s.get(); 
    944         //      cerr<<"hash: "<<makeHexDump(hash)<<endl; 
    945         dh->id=tmp; 
    946  
    947         if(g_packetCache.count(hash)) { 
     905 
     906        string response; 
     907        if(g_packetCache.getResponsePacket(string(data, len), g_now.tv_sec, &response)) { 
    948908          g_stats.packetCacheHits++; 
    949909          SyncRes::s_queries++; 
    950           string reply=g_packetCache[hash];  
    951           ((struct dnsheader*)reply.c_str())->id=tmp; 
    952           sendto(fd, reply.c_str(), reply.length(), 0, (struct sockaddr*) &fromaddr, fromaddr.getSocklen()); 
     910          sendto(fd, response.c_str(), response.length(), 0, (struct sockaddr*) &fromaddr, fromaddr.getSocklen()); 
    953911          return; 
    954912        } 
    955913 
    956         DNSComboWriter* dc = new DNSComboWriter(data, len, hash, g_now); 
     914        DNSComboWriter* dc = new DNSComboWriter(data, len, g_now); 
    957915        dc->setSocket(fd); 
    958916        dc->setRemote(&fromaddr); 
     
    16581616  if(::arg().mustDo("export-etc-hosts")) { 
    16591617    string line; 
    1660     string fname; 
    1661      
    1662     ifstream ifs("/etc/hosts"); 
     1618    string fname=::arg()["etc-hosts-file"]; 
     1619     
     1620    ifstream ifs(fname.c_str()); 
    16631621    if(!ifs) { 
    16641622      L<<Logger::Warning<<"Could not open /etc/hosts for reading"<<endl; 
     
    20151973    Utility::gettimeofday(&g_now, 0); 
    20161974    t_fdm->run(&g_now); 
    2017     Utility::gettimeofday(&g_now, 0); 
     1975    // 'run' updates g_now for us 
    20181976 
    20191977    if(listenOnTCP) { 
     
    21402098    ::arg().set("forward-zones-file", "File with domain=ip pairs for forwarding")=""; 
    21412099    ::arg().set("export-etc-hosts", "If we should serve up contents from /etc/hosts")="off"; 
     2100    ::arg().set("etc-hosts-file", "Path to 'hosts' file")="/etc/hosts"; 
    21422101    ::arg().set("serve-rfc1918", "If we should be authoritative for RFC 1918 private IP space")=""; 
    21432102    ::arg().set("auth-can-lower-ttl", "If we follow RFC 2181 to the letter, an authoritative server can lower the TTL of NS records")="off";