Changeset 1635
- Timestamp:
- 06/13/10 22:45:28 (3 years ago)
- Location:
- trunk/pdns/pdns
- Files:
-
- 2 modified
-
dnsbulktest.cc (modified) (8 diffs)
-
inflighter.cc (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/dnsbulktest.cc
r1634 r1635 34 34 connect(d_socket, (struct sockaddr*)&remote, remote.getSocklen()); 35 35 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; 37 37 for(unsigned int id =0 ; id < numeric_limits<uint16_t>::max(); ++id) 38 38 d_idqueue.push_back(id); … … 52 52 53 53 DNSPacketWriter pw(packet, domain, QType::A); 54 54 55 if(d_idqueue.empty()) { 56 cerr<<"Exhausted ids!"<<endl; 57 exit(1); 58 } 55 59 pw.getHeader()->id = d_idqueue.front(); 56 60 d_idqueue.pop_front(); … … 58 62 pw.getHeader()->qr = 0; 59 63 60 ::send(d_socket, &*packet.begin(), packet.size(), 0); 64 if(::send(d_socket, &*packet.begin(), packet.size(), 0) < 0) 65 d_senderrors++; 61 66 62 67 return pw.getHeader()->id; … … 94 99 95 100 id = mdp.d_header.id; 101 d_idqueue.push_back(id); 96 102 97 103 return 1; … … 128 134 } 129 135 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; 131 137 }; 132 138 … … 144 150 Inflighter<vector<string>, SendReceive> inflighter(domains, sr); 145 151 inflighter.d_maxInFlight = 1000; 146 inflighter.d_timeoutSeconds = 15;152 inflighter.d_timeoutSeconds = 3; 147 153 string line; 148 154 … … 160 166 random_shuffle(domains.begin(), domains.end()); 161 167 168 boost::format datafmt("%s %|20t|%+15s %|40t|%s %|60t|%+15s\n"); 169 162 170 for(;;) { 163 171 try { … … 169 177 } 170 178 } 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 178 213 } 179 214 -
trunk/pdns/pdns/inflighter.cc
r1634 r1635 31 31 d_init=true; 32 32 } 33 void run(); 33 34 bool run(); //!< keep calling this as long as it returns 1, or if it throws an exception 34 35 35 36 unsigned int d_maxInFlight; … … 78 79 }; 79 80 80 template<typename Container, typename SendReceive> voidInflighter<Container, SendReceive>::run()81 template<typename Container, typename SendReceive> bool Inflighter<Container, SendReceive>::run() 81 82 { 82 83 if(!d_init) 83 84 init(); 84 85 85 // cout << "Have "<<d_container.size() << " things to do!"<<endl;86 87 86 for(;;) { 88 87 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) 89 90 while(d_iter != d_container.end() && d_ttdWatch.size() < d_maxInFlight) { 90 91 TTDItem ttdi; … … 93 94 gettimeofday(&ttdi.ttd, 0); 94 95 ttdi.ttd.tv_sec += d_timeoutSeconds; 95 96 if(d_ttdWatch.count(ttdi.id)) { 97 // cerr<<"DUPLICATE INSERT!"<<endl; 98 } 96 99 d_ttdWatch.insert(ttdi); 97 100 … … 100 103 } 101 104 int processed=0; 105 106 107 // if there are queries in flight, handle responses 102 108 if(!d_ttdWatch.empty()) { 103 109 // cerr<<"Have "<< d_ttdWatch.size() <<" queries in flight"<<endl; … … 105 111 typename SendReceive::Identifier id; 106 112 113 // get as many answers as available - 'receive' should block for a short while to wait for an answer 107 114 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! 110 118 ++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 113 120 d_ttdWatch.erase(ival); 114 121 break; // we can send new questions! … … 121 128 122 129 123 if(!processed ) { // no new responses, time for some cleanup130 if(!processed /* || d_ttdWatch.size() > 10000 */ ) { // no new responses, time for some cleanup of the ttdWatch 124 131 struct timeval now; 125 132 gettimeofday(&now, 0); … … 128 135 waiters_by_ttd_index_t& waiters_index = boost::multi_index::get<TimeTag>(d_ttdWatch); 129 136 137 // this provides a list of items sorted by age 130 138 for(typename waiters_by_ttd_index_t::iterator valiter = waiters_index.begin(); valiter != waiters_index.end(); ) { 131 139 if(valiter->ttd.tv_sec < now.tv_sec || (valiter->ttd.tv_sec == now.tv_sec && valiter->ttd.tv_usec < now.tv_usec)) { … … 136 144 } 137 145 else 138 break; 146 break; // if this one was too new, rest will be too 139 147 } 140 148 } … … 143 151 break; 144 152 } 153 return false; 145 154 } 146 155