Changeset 446

Show
Ignore:
Timestamp:
07/14/05 22:45:57 (8 years ago)
Author:
ahu
Message:

made dnsreplay lots more efficient

Files:
1 modified

Legend:

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

    r442 r446  
    3636 
    3737StatBag S; 
     38bool s_quiet=true; 
    3839 
    3940class DNSIDManager 
     
    4344  int getID() 
    4445  { 
    45  
    46     for(unsigned int n=0; n < d_freeids.size() ; ++n) 
     46    for(uint16_t n=d_lastfreeid+1; n != d_lastfreeid ; ++n) 
    4747      if(!d_freeids[n]) { 
    4848        d_freeids[n]=1; 
     49        d_lastfreeid=n; 
    4950        return n; 
    5051      } 
     
    5859      throw runtime_error("Trying to release unused id: "+lexical_cast<string>(id)); 
    5960    d_freeids[id]=0; 
     61    d_lastfreeid=id-1; 
    6062  } 
    6163 
    6264private: 
    6365  bitset<65536> d_freeids; 
     66  uint16_t d_lastfreeid; 
    6467} s_idmanager; 
    6568 
     
    8285unsigned int s_weunmatched, s_origunmatched; 
    8386unsigned int s_wednserrors, s_origdnserrors; 
    84 // XXX FIXME wasteful 
     87 
    8588void pruneQids() 
    8689{ 
    87   qids_t nqids; 
    8890  struct timeval now; 
    8991  gettimeofday(&now, 0); 
    90   for(qids_t::iterator i=qids.begin(); i!=qids.end(); ++i) 
     92 
     93  for(qids_t::iterator i=qids.begin(); i!=qids.end(); ) { 
    9194    if(now.tv_sec < i->second.d_sentTime.tv_sec + 4 || (now.tv_sec == i->second.d_sentTime.tv_sec &&  now.tv_usec < i->second.d_sentTime.tv_usec))  
    92       nqids[i->first]=i->second; 
     95      ++i; 
    9396    else { 
    9497      s_idmanager.releaseID(i->second.d_assignedID); 
     
    99102      else 
    100103        cerr<<"Impossible - finished QI in the pool"<<endl; 
    101     } 
    102  
    103   nqids.swap(qids); 
     104      qids.erase(i++); 
     105    } 
     106  } 
    104107} 
    105108 
     
    121124{ 
    122125  QuestionData qd=qids[qi]; 
    123   cout<<qi<<", orig rcode: "<<qd.d_origRcode<<", ours: "<<qd.d_newRcode; 
     126 
    124127 
    125128  set<DNSRecord> canonicOrig, canonicNew; 
    126129  compactAnswerSet(qd.d_origAnswers, canonicOrig); 
    127130  compactAnswerSet(qd.d_newAnswers, canonicNew); 
    128    
    129   cout<<", "<<canonicOrig.size()<< " vs " << canonicNew.size()<<", perfect: "; 
     131 
     132  if(!s_quiet) { 
     133    cout<<qi<<", orig rcode: "<<qd.d_origRcode<<", ours: "<<qd.d_newRcode;   
     134    cout<<", "<<canonicOrig.size()<< " vs " << canonicNew.size()<<", perfect: "; 
     135  } 
    130136 
    131137  if(canonicOrig==canonicNew) { 
    132138    s_perfect++; 
    133     cout<<"yes\n"; 
     139    if(!s_quiet) 
     140      cout<<"yes\n"; 
    134141  } 
    135142  else { 
    136     cout<<"no\n"; 
     143    if(!s_quiet) 
     144      cout<<"no\n"; 
    137145     
    138146    if(qd.d_norecursionavailable) 
    139       cout<<"\t* original nameserver did not provide recursion for this question *"<<endl; 
     147      if(!s_quiet) 
     148        cout<<"\t* original nameserver did not provide recursion for this question *"<<endl; 
    140149    if(qd.d_origRcode == qd.d_newRcode ) { 
    141       cout<<"\t* mostly correct *"<<endl; 
     150      if(!s_quiet) 
     151        cout<<"\t* mostly correct *"<<endl; 
    142152      s_mostly++; 
    143153    } 
    144154 
    145155    if(!isRcodeOk(qd.d_origRcode) && isRcodeOk(qd.d_newRcode)) { 
    146       cout<<"\t* we better *"<<endl; 
     156      if(!s_quiet) 
     157        cout<<"\t* we better *"<<endl; 
    147158      s_webetter++; 
    148159    } 
    149160    if(isRcodeOk(qd.d_origRcode) && !isRcodeOk(qd.d_newRcode)) { 
    150       cout<<"\t* orig better *"<<endl; 
     161      if(!s_quiet) 
     162        cout<<"\t* orig better *"<<endl; 
    151163      s_origbetter++; 
    152164      s_origbetterset.insert(make_pair(qi.d_qname, qi.d_qtype)); 
    153165    } 
    154166 
    155     cout<<"orig:\n"; 
    156     for(set<DNSRecord>::const_iterator i=canonicOrig.begin(); i!=canonicOrig.end(); ++i) 
     167    if(!s_quiet) { 
     168      cout<<"orig:\n"; 
     169      for(set<DNSRecord>::const_iterator i=canonicOrig.begin(); i!=canonicOrig.end(); ++i) 
     170        cout<<"\t"<<i->d_label<<"\t"<<DNSRecordContent::NumberToType(i->d_type)<<"\t'"  << (i->d_content ? i->d_content->getZoneRepresentation() : "") <<"'\n"; 
     171      cout<<"new:\n"; 
     172      for(set<DNSRecord>::const_iterator i=canonicNew.begin(); i!=canonicNew.end(); ++i) 
    157173      cout<<"\t"<<i->d_label<<"\t"<<DNSRecordContent::NumberToType(i->d_type)<<"\t'"  << (i->d_content ? i->d_content->getZoneRepresentation() : "") <<"'\n"; 
    158     cout<<"new:\n"; 
    159     for(set<DNSRecord>::const_iterator i=canonicNew.begin(); i!=canonicNew.end(); ++i) 
    160       cout<<"\t"<<i->d_label<<"\t"<<DNSRecordContent::NumberToType(i->d_type)<<"\t'"  << (i->d_content ? i->d_content->getZoneRepresentation() : "") <<"'\n"; 
    161     cout<<"\n"; 
     174      cout<<"\n"; 
     175    } 
    162176  } 
    163177 
     
    251265    if(!((once++)%2000)) { 
    252266      Lock l(&s_lock); 
     267 
     268      if(qids.size() > 1000) { 
     269        cerr<<"Too many questions outstanding, waiting a second"<<endl; 
     270        sleep(1); 
     271      } 
     272       
    253273      pruneQids(); 
     274 
     275      cerr<<"There are "<<qids.size()<<" queries in flight"<<endl; 
     276 
    254277      cerr<<"we drop: "<<s_timedout<<", orig drop: "<<s_nooriginalanswer<<", "<<s_questions<<" questions sent, "<<s_answers 
    255278          <<" original answers, "<<s_perfect<<" perfect, "<<s_mostly<<" mostly correct"<<", "<<s_webetter<<" we better, "<<s_origbetter<<" orig better ("<<s_origbetterset.size()<<" diff)"<<endl; 
     
    273296          Lock l(&s_lock); 
    274297          if(qids.count(qi)) { 
    275             cout<<"Saw an exact duplicate question, "<<qi<< endl; 
     298            if(!s_quiet) 
     299              cout<<"Saw an exact duplicate question, "<<qi<< endl; 
    276300            continue; 
    277301          } 
     
    291315          double seconds=pr.d_pheader.ts.tv_sec - lastsent.tv_sec; 
    292316          double useconds=(pr.d_pheader.ts.tv_usec - lastsent.tv_usec); 
     317 
     318          if(useconds < 0) { 
     319            seconds-=1; 
     320            useconds+=1000000; 
     321          } 
     322 
    293323          double factor=10; 
    294324           
     
    301331          tosleep.tv_sec=nanoseconds/1000000000UL; 
    302332          tosleep.tv_nsec=nanoseconds%1000000000UL; 
    303            
     333 
    304334          nanosleep(&tosleep, 0); 
    305335          lastsent=pr.d_pheader.ts; 
    306336        } 
     337        if(!lastsent.tv_sec) 
     338          lastsent=pr.d_pheader.ts; 
    307339 
    308340        //      cout<<"sending!"<<endl; 
     
    333365        else { 
    334366          s_origunmatched++; 
    335           cout<<"Unmatched original answer "<<qi<<endl; 
     367          if(!s_quiet) 
     368            cout<<"Unmatched original answer "<<qi<<endl; 
    336369        } 
    337370      }