Changeset 446
- Timestamp:
- 07/14/05 22:45:57 (8 years ago)
- Files:
-
- 1 modified
-
trunk/pdns/pdns/dnsreplay.cc (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/pdns/pdns/dnsreplay.cc
r442 r446 36 36 37 37 StatBag S; 38 bool s_quiet=true; 38 39 39 40 class DNSIDManager … … 43 44 int getID() 44 45 { 45 46 for(unsigned int n=0; n < d_freeids.size() ; ++n) 46 for(uint16_t n=d_lastfreeid+1; n != d_lastfreeid ; ++n) 47 47 if(!d_freeids[n]) { 48 48 d_freeids[n]=1; 49 d_lastfreeid=n; 49 50 return n; 50 51 } … … 58 59 throw runtime_error("Trying to release unused id: "+lexical_cast<string>(id)); 59 60 d_freeids[id]=0; 61 d_lastfreeid=id-1; 60 62 } 61 63 62 64 private: 63 65 bitset<65536> d_freeids; 66 uint16_t d_lastfreeid; 64 67 } s_idmanager; 65 68 … … 82 85 unsigned int s_weunmatched, s_origunmatched; 83 86 unsigned int s_wednserrors, s_origdnserrors; 84 // XXX FIXME wasteful 87 85 88 void pruneQids() 86 89 { 87 qids_t nqids;88 90 struct timeval now; 89 91 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(); ) { 91 94 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; 93 96 else { 94 97 s_idmanager.releaseID(i->second.d_assignedID); … … 99 102 else 100 103 cerr<<"Impossible - finished QI in the pool"<<endl; 101 }102 103 nqids.swap(qids);104 qids.erase(i++); 105 } 106 } 104 107 } 105 108 … … 121 124 { 122 125 QuestionData qd=qids[qi]; 123 cout<<qi<<", orig rcode: "<<qd.d_origRcode<<", ours: "<<qd.d_newRcode; 126 124 127 125 128 set<DNSRecord> canonicOrig, canonicNew; 126 129 compactAnswerSet(qd.d_origAnswers, canonicOrig); 127 130 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 } 130 136 131 137 if(canonicOrig==canonicNew) { 132 138 s_perfect++; 133 cout<<"yes\n"; 139 if(!s_quiet) 140 cout<<"yes\n"; 134 141 } 135 142 else { 136 cout<<"no\n"; 143 if(!s_quiet) 144 cout<<"no\n"; 137 145 138 146 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; 140 149 if(qd.d_origRcode == qd.d_newRcode ) { 141 cout<<"\t* mostly correct *"<<endl; 150 if(!s_quiet) 151 cout<<"\t* mostly correct *"<<endl; 142 152 s_mostly++; 143 153 } 144 154 145 155 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; 147 158 s_webetter++; 148 159 } 149 160 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; 151 163 s_origbetter++; 152 164 s_origbetterset.insert(make_pair(qi.d_qname, qi.d_qtype)); 153 165 } 154 166 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) 157 173 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 } 162 176 } 163 177 … … 251 265 if(!((once++)%2000)) { 252 266 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 253 273 pruneQids(); 274 275 cerr<<"There are "<<qids.size()<<" queries in flight"<<endl; 276 254 277 cerr<<"we drop: "<<s_timedout<<", orig drop: "<<s_nooriginalanswer<<", "<<s_questions<<" questions sent, "<<s_answers 255 278 <<" original answers, "<<s_perfect<<" perfect, "<<s_mostly<<" mostly correct"<<", "<<s_webetter<<" we better, "<<s_origbetter<<" orig better ("<<s_origbetterset.size()<<" diff)"<<endl; … … 273 296 Lock l(&s_lock); 274 297 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; 276 300 continue; 277 301 } … … 291 315 double seconds=pr.d_pheader.ts.tv_sec - lastsent.tv_sec; 292 316 double useconds=(pr.d_pheader.ts.tv_usec - lastsent.tv_usec); 317 318 if(useconds < 0) { 319 seconds-=1; 320 useconds+=1000000; 321 } 322 293 323 double factor=10; 294 324 … … 301 331 tosleep.tv_sec=nanoseconds/1000000000UL; 302 332 tosleep.tv_nsec=nanoseconds%1000000000UL; 303 333 304 334 nanosleep(&tosleep, 0); 305 335 lastsent=pr.d_pheader.ts; 306 336 } 337 if(!lastsent.tv_sec) 338 lastsent=pr.d_pheader.ts; 307 339 308 340 // cout<<"sending!"<<endl; … … 333 365 else { 334 366 s_origunmatched++; 335 cout<<"Unmatched original answer "<<qi<<endl; 367 if(!s_quiet) 368 cout<<"Unmatched original answer "<<qi<<endl; 336 369 } 337 370 }