Changeset 1635

Show
Ignore:
Timestamp:
06/13/10 22:45:28 (3 years ago)
Author:
ahu
Message:

comment the 'inflighter' a bit, plus add very nice statistical output to dnsbulktest
see  http://bert-hubert.blogspot.com/2010/06/better-statistical-regression-tests.html

Location:
trunk/pdns/pdns
Files:
2 modified

Legend:

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

    r1634 r1635  
    3434    connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen()); 
    3535    d_oks = d_errors = d_nodatas = d_nxdomains = d_unknowns = 0; 
    36     d_receiveds = d_receiveerrors = 0; 
     36    d_receiveds = d_receiveerrors = d_senderrors = 0; 
    3737    for(unsigned int id =0 ; id < numeric_limits<uint16_t>::max(); ++id)  
    3838      d_idqueue.push_back(id); 
     
    5252   
    5353    DNSPacketWriter pw(packet, domain, QType::A); 
    54      
     54 
     55    if(d_idqueue.empty()) { 
     56      cerr<<"Exhausted ids!"<<endl; 
     57      exit(1); 
     58    }     
    5559    pw.getHeader()->id = d_idqueue.front(); 
    5660    d_idqueue.pop_front(); 
     
    5862    pw.getHeader()->qr = 0; 
    5963     
    60     ::send(d_socket, &*packet.begin(), packet.size(), 0); 
     64    if(::send(d_socket, &*packet.begin(), packet.size(), 0) < 0) 
     65      d_senderrors++; 
    6166     
    6267    return pw.getHeader()->id; 
     
    9499       
    95100      id = mdp.d_header.id; 
     101      d_idqueue.push_back(id); 
    96102     
    97103      return 1; 
     
    128134  } 
    129135  unsigned int d_errors, d_nxdomains, d_nodatas, d_oks, d_unknowns; 
    130   unsigned int d_receiveds, d_receiveerrors; 
     136  unsigned int d_receiveds, d_receiveerrors, d_senderrors; 
    131137}; 
    132138 
     
    144150  Inflighter<vector<string>, SendReceive> inflighter(domains, sr); 
    145151  inflighter.d_maxInFlight = 1000; 
    146   inflighter.d_timeoutSeconds = 15; 
     152  inflighter.d_timeoutSeconds = 3; 
    147153  string line; 
    148154   
     
    160166  random_shuffle(domains.begin(), domains.end()); 
    161167 
     168  boost::format datafmt("%s %|20t|%+15s  %|40t|%s %|60t|%+15s\n"); 
     169 
    162170  for(;;) { 
    163171    try { 
     
    169177    } 
    170178  } 
    171   cerr<<"Results: "<<sr.d_errors<<" errors, "<<sr.d_oks<<" oks, "<<sr.d_nodatas<<" nodatas, "<<sr.d_nxdomains<<" nxdomains, "<<inflighter.getTimeouts()<<" timeouts"<<endl; 
    172   cerr<<sr.d_unknowns<<" answers with an unknown status"<<endl; 
    173    
    174   cerr<<domains.size() - (sr.d_errors + sr.d_oks + sr.d_nodatas + sr.d_nxdomains + inflighter.getTimeouts() + sr.d_unknowns)<<" status results missing"<<endl; 
    175   cerr<<sr.d_receiveerrors<<" receive errors, "<<sr.d_receiveds<<" packets received correctly"<<endl; 
    176  
    177   cerr<<inflighter.getUnexpecteds()<<" unexpected responses (probably seen as timeouts)"<<endl; 
     179 
     180  cerr<< datafmt % "Sending" % "" % "Receiving" % ""; 
     181  cerr<< datafmt % "  Queued " % domains.size() % "  Received" % sr.d_receiveds; 
     182  cerr<< datafmt % "  Error -/-" % sr.d_senderrors %  "  Timeouts" % inflighter.getTimeouts(); 
     183  cerr<< datafmt % " " % "" %  "  Unexpected" % inflighter.getUnexpecteds(); 
     184   
     185  cerr<< datafmt % " Sent" % (domains.size() - sr.d_senderrors) %  " Total" % (sr.d_receiveds + inflighter.getTimeouts() + inflighter.getUnexpecteds()); 
     186   
     187  cerr<<endl;   
     188  cerr<< datafmt % "DNS Status" % ""       % "" % ""; 
     189  cerr<< datafmt % "  OK" % sr.d_oks       % "" % ""; 
     190  cerr<< datafmt % "  Error" % sr.d_errors       % "" % "";   
     191  cerr<< datafmt % "  No Data" % sr.d_nodatas       % "" % "";   
     192  cerr<< datafmt % "  NXDOMAIN" % sr.d_nxdomains      % "" % ""; 
     193  cerr<< datafmt % "  Unknowns" % sr.d_unknowns      % "" % "";   
     194  cerr<< datafmt % "Answers" % (sr.d_oks      +      sr.d_errors      +      sr.d_nodatas      + sr.d_nxdomains           +      sr.d_unknowns) % "" % ""; 
     195  cerr<< datafmt % "  Timeouts " % (inflighter.getTimeouts()) % "" % ""; 
     196  cerr<< datafmt % "Total " % (sr.d_oks      +      sr.d_errors      +      sr.d_nodatas      + sr.d_nxdomains           +      sr.d_unknowns + inflighter.getTimeouts()) % "" % ""; 
     197   
     198  /* 
     199   
     200  cerr<<"Questions: "<<domains.size()<<", responses + network errors + timeouts:  " <<  
     201    sr.d_receiveds <<" + " << sr.d_receiveerrors<<" + " << inflighter.getTimeouts()<< " = " << 
     202    sr.d_receiveds     +      sr.d_receiveerrors    +      inflighter.getTimeouts()  <<endl; 
     203     
     204  cerr<< "Unexpected responses "<< inflighter.getUnexpecteds() << endl; 
     205   
     206  cerr<<"DNS OK + DNS Error + NODATA + NXDOMAIN + Unknown: "<< 
     207    sr.d_oks << " + " << sr.d_errors << " + " << sr.d_nodatas << " + " << sr.d_nxdomains << " + " << sr.d_unknowns << " = " << 
     208    sr.d_oks      +      sr.d_errors      +      sr.d_nodatas      + sr.d_nxdomains           +      sr.d_unknowns << endl; 
     209   
     210  cerr<< "(" << domains.size() - (sr.d_errors + sr.d_oks + sr.d_nodatas + sr.d_nxdomains + inflighter.getTimeouts() + sr.d_unknowns)<<" status results missing)"<<endl; 
     211  */ 
     212   
    178213} 
    179214 
  • trunk/pdns/pdns/inflighter.cc

    r1634 r1635  
    3131    d_init=true; 
    3232  } 
    33   void run(); 
     33   
     34  bool run(); //!< keep calling this as long as it returns 1, or if it throws an exception  
    3435   
    3536  unsigned int d_maxInFlight; 
     
    7879}; 
    7980 
    80 template<typename Container, typename SendReceive> void Inflighter<Container, SendReceive>::run() 
     81template<typename Container, typename SendReceive> bool Inflighter<Container, SendReceive>::run() 
    8182{ 
    8283  if(!d_init) 
    8384    init(); 
    8485     
    85   // cout << "Have "<<d_container.size() << " things to do!"<<endl; 
    86    
    8786  for(;;) { 
    8887    int burst = 0; 
     88 
     89    // 'send' as many items as allowed, limited by 'max in flight' and our burst parameter (which limits query rate growth) 
    8990    while(d_iter != d_container.end() && d_ttdWatch.size() < d_maxInFlight) {  
    9091      TTDItem ttdi; 
     
    9394      gettimeofday(&ttdi.ttd, 0); 
    9495      ttdi.ttd.tv_sec += d_timeoutSeconds; 
    95        
     96      if(d_ttdWatch.count(ttdi.id)) { 
     97//        cerr<<"DUPLICATE INSERT!"<<endl; 
     98      } 
    9699      d_ttdWatch.insert(ttdi); 
    97100       
     
    100103    } 
    101104    int processed=0; 
     105     
     106     
     107    // if there are queries in flight, handle responses 
    102108    if(!d_ttdWatch.empty()) { 
    103109      // cerr<<"Have "<< d_ttdWatch.size() <<" queries in flight"<<endl;             
     
    105111      typename SendReceive::Identifier id; 
    106112       
     113      // get as many answers as available - 'receive' should block for a short while to wait for an answer 
    107114      while(d_sr.receive(id, answer)) { 
    108         typename ttdwatch_t::iterator ival = d_ttdWatch.find(id); 
    109         if(ival != d_ttdWatch.end()) { 
     115        typename ttdwatch_t::iterator ival = d_ttdWatch.find(id); // match up what we received to what we were waiting for 
     116 
     117        if(ival != d_ttdWatch.end()) { // found something! 
    110118          ++processed; 
    111           // cerr<<"Received expected item with id '"<<id<<"' and value '"<<item<<"'"<<endl; 
    112           d_sr.deliverAnswer(*ival->iter, answer); 
     119          d_sr.deliverAnswer(*ival->iter, answer);    // deliver to sender/receiver 
    113120          d_ttdWatch.erase(ival); 
    114121          break; // we can send new questions! 
     
    121128     
    122129       
    123       if(!processed) { // no new responses, time for some cleanup 
     130      if(!processed /* || d_ttdWatch.size() > 10000 */ ) { // no new responses, time for some cleanup of the ttdWatch 
    124131        struct timeval now; 
    125132        gettimeofday(&now, 0); 
     
    128135        waiters_by_ttd_index_t& waiters_index = boost::multi_index::get<TimeTag>(d_ttdWatch); 
    129136 
     137        // this provides a list of items sorted by age 
    130138        for(typename waiters_by_ttd_index_t::iterator valiter = waiters_index.begin(); valiter != waiters_index.end(); ) { 
    131139          if(valiter->ttd.tv_sec < now.tv_sec || (valiter->ttd.tv_sec == now.tv_sec && valiter->ttd.tv_usec < now.tv_usec)) { 
     
    136144          } 
    137145          else  
    138             break; 
     146            break; // if this one was too new, rest will be too 
    139147        } 
    140148      } 
     
    143151      break; 
    144152  } 
     153  return false; 
    145154} 
    146155