Changeset 658

Show
Ignore:
Timestamp:
04/05/2006 01:11:35 PM (3 years ago)
Author:
ahu
Message:

fix interesting bug whereby powerdns would sometimes claim to be unable to resolve its rootservers. Found by valgrind. Halve number of s_negcache lookups.

Location:
trunk/pdns/pdns
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/pdns/pdns/syncres.cc

    r655 r658  
    6666int SyncRes::doResolve(const string &qname, const QType &qtype, vector<DNSResourceRecord>&ret, int depth, set<GetBestNSAnswer>& beenthere) 
    6767{ 
    68    
    6968  string prefix; 
    7069  if(s_log) { 
     
    7372  } 
    7473   
    75   int res; 
     74  int res=0; 
    7675  if(!(d_nocache && qtype.getCode()==QType::NS && qname.empty())) { 
    7776    if(doCNAMECacheCheck(qname,qtype,ret,depth,res)) // will reroute us if needed 
     
    114113 
    115114  if(!doResolve(qname,QType(QType::A), res,depth+1,beenthere) && !res.empty()) { 
    116     for(res_t::const_iterator i=res.begin(); i!= res.end(); ++i) 
     115    for(res_t::const_iterator i=res.begin(); i!= res.end(); ++i) { 
    117116      if(i->qtype.getCode()==QType::A) { 
    118117        uint32_t ip; 
     
    120119          ret.push_back(ntohl(ip)); 
    121120      } 
     121    } 
    122122  } 
    123123  if(ret.size() > 1) 
     
    248248  QType sqt(qtype); 
    249249  uint32_t sttl=0; 
    250  
    251   pair<string,QType> tuple(toLower(qname), QType(0)); 
    252   negcache_t::iterator ni=s_negcache.find(tuple); 
    253  
    254   if(ni!=s_negcache.end()) { 
    255     res=0; 
    256     if((uint32_t)d_now.tv_sec < ni->d_ttd) { 
    257       sttl=ni->d_ttd - d_now.tv_sec; 
    258       LOG<<prefix<<qname<<": Entire record '"<<toLower(qname)<<"', is negatively cached for another "<<sttl<<" seconds"<<endl; 
    259       res=RCode::NXDomain;  
    260       giveNegative=true; 
    261       sqname=ni->d_qname; 
    262       sqt=QType::SOA; 
    263     } 
    264     else { 
    265       LOG<<prefix<<qname<<": Entire record '"<<toLower(qname)<<"' was negatively cached, but entry expired"<<endl; 
    266       s_negcache.erase(ni); 
    267     } 
    268   } 
    269  
    270   if(!giveNegative) { // let's try some more 
    271     tuple.second=qtype; 
    272     LOG<<prefix<<qname<<": Looking for direct cache hit of '"<<qname<<"|"<<qtype.getName()<<"', negative cached: "<<s_negcache.count(tuple)<<endl; 
    273  
    274     res=0; 
    275     ni=s_negcache.find(tuple); 
    276     if(ni!=s_negcache.end()) { 
     250  //  cout<<"Lookup for '"<<qname<<"|"<<qtype.getName()<<"'\n"; 
     251 
     252  pair<negcache_t::const_iterator, negcache_t::const_iterator> range=s_negcache.equal_range(tie(toLower(qname))); 
     253  negcache_t::iterator ni; 
     254  for(ni=range.first; ni != range.second; ni++) { 
     255    // we have something 
     256    if(ni->d_qtype.getCode() == 0 || ni->d_qtype == qtype) { 
     257      res=0; 
    277258      if((uint32_t)d_now.tv_sec < ni->d_ttd) { 
    278259        sttl=ni->d_ttd - d_now.tv_sec; 
    279         LOG<<prefix<<qname<<": "<<qtype.getName()<<" is negatively cached for another "<<sttl<<" seconds"<<endl; 
    280         res=RCode::NoError; // only this record doesn't exist 
     260        if(ni->d_qtype.getCode()) { 
     261          LOG<<prefix<<qname<<": "<<qtype.getName()<<" is negatively cached for another "<<sttl<<" seconds"<<endl; 
     262          res = RCode::NoError; 
     263        } 
     264        else { 
     265          LOG<<prefix<<qname<<": Entire record '"<<toLower(qname)<<"', is negatively cached for another "<<sttl<<" seconds"<<endl; 
     266          res= RCode::NXDomain;  
     267        } 
    281268        giveNegative=true; 
    282269        sqname=ni->d_qname; 
    283         sqt="SOA"; 
     270        sqt=QType::SOA; 
     271        break; 
    284272      } 
    285273      else { 
    286         LOG<<prefix<<qname<<": "<<qtype.getName()<<" was negatively cached, but entry expired"<<endl; 
    287         s_negcache.erase(ni); 
     274        LOG<<prefix<<qname<<": Entire record '"<<toLower(qname)<<"' was negatively cached, but entry expired"<<endl; 
    288275      } 
    289276    } 
     
    315302   
    316303    LOG<<endl; 
    317     if(found && !expired)  
     304    if(found && !expired) { 
     305      res=0; 
    318306      return true; 
     307    } 
    319308    else 
    320309      LOG<<prefix<<qname<<": cache had only stale entries"<<endl; 
    321310  } 
     311 
    322312  return false; 
    323313} 
     
    527517          ne.d_qname=i->qname; 
    528518          ne.d_ttd=d_now.tv_sec + min(i->ttl, 3600U); // controversial 
    529           ne.d_key.first=toLower(qname); 
    530           ne.d_key.second=QType(0); 
     519          ne.d_name=toLower(qname); 
     520          ne.d_qtype=QType(0); 
    531521          s_negcache.insert(ne); 
    532522          negindic=true; 
     
    568558          ne.d_qname=i->qname; 
    569559          ne.d_ttd=d_now.tv_sec + min(3600U,i->ttl); 
    570           ne.d_key=make_pair(toLower(qname), qtype); 
     560          ne.d_name=toLower(qname); 
     561          ne.d_qtype=qtype; 
    571562          if(qtype.getCode())   // prevents us from blacking out a whole domain 
    572563            s_negcache.insert(ne); 
  • trunk/pdns/pdns/syncres.hh

    r655 r658  
    2626struct NegCacheEntry 
    2727{ 
    28   pair<string, QType> d_key; 
     28  string d_name; 
    2929  QType d_qtype; 
    3030  string d_qname; 
     
    249249    indexed_by < 
    250250       ordered_unique< 
    251            member<NegCacheEntry, pair<string,QType>, &NegCacheEntry::d_key> 
     251           composite_key< 
     252                 NegCacheEntry, 
     253                    member<NegCacheEntry, string, &NegCacheEntry::d_name>, 
     254                    member<NegCacheEntry, QType, &NegCacheEntry::d_qtype> 
     255           > 
    252256       >, 
    253257       ordered_non_unique<