27 auto begin_it = std::get<0>(sent_packets_its);
28 auto end_it = std::get<1>(sent_packets_its);
33 int still_left_cnt = 0;
34 int current_cycle_resent_cnt = 0;
35 for (
auto it = begin_it; it != end_it; ++it) {
39 auto trans_id = pkt->getTransid();
42 auto start_time = pkt->getTimestamp();
43 int current_pkt_resent_cnt = 0;
44 auto r_it = retrans.find(trans_id);
45 auto s_it = start_times.find(trans_id);
46 if (r_it != retrans.end() && s_it != start_times.end()) {
47 start_time = s_it->second;
48 current_pkt_resent_cnt = r_it->second;
50 start_times[trans_id] = start_time;
54 int delay = (1 << current_pkt_resent_cnt);
59 delay += random() % 2000 - 1000;
62 auto now = microsec_clock::universal_time();
63 if (now - start_time > milliseconds(delay)) {
64 current_cycle_resent_cnt++;
69 Pkt4Ptr pkt4 = boost::dynamic_pointer_cast<Pkt4>(pkt);
72 Pkt6Ptr pkt6 = boost::dynamic_pointer_cast<Pkt6>(pkt);
77 pkt->setTimestamp(start_time);
79 current_pkt_resent_cnt++;
80 retrans[trans_id] = current_pkt_resent_cnt;
83 if (current_cycle_resent_cnt > 0) {
84 auto now = microsec_clock::universal_time();
85 std::ostringstream ss;
86 ss << now <<
" " << xchg_type <<
": still waiting for "
87 << still_left_cnt <<
" answers, resent " << current_cycle_resent_cnt
88 <<
", retrying " << retrans.size() << std::endl;
89 std::cout << ss.str();
91 return (still_left_cnt);
107 uint32_t clients_num =
options_.getClientsNum() == 0 ?
114 auto start = microsec_clock::universal_time();
117 tc_.sendPackets(clients_num);
119 auto now = microsec_clock::universal_time();
120 auto prev_cycle_time = now;
124 tc_.consumeReceivedPackets();
128 now = microsec_clock::universal_time();
133 if (now - prev_cycle_time > milliseconds(200)) {
134 prev_cycle_time = now;
135 int still_left_cnt = 0;
141 if (still_left_cnt == 0) {
146 if (
tc_.interrupted()) {
151 auto stop = microsec_clock::universal_time();
152 boost::posix_time::time_period duration(start, stop);
164 if (
options_.testDiags(
's') &&
tc_.serverIdReceived()) {
165 std::cout <<
"Server id: " <<
tc_.getServerId() << std::endl;
170 std::cout <<
"Interrupted" << std::endl;
180 int total_rcvd_pkts = 0;
191 std::ostringstream ss;
192 ss <<
"It took " << duration.length() <<
" to provision " << clients_num
193 <<
" clients. " << std::endl
194 <<
"Requests sent + resent: " << total_sent_pkts << std::endl
196 <<
"Responses received: " << total_rcvd_pkts << std::endl;
197 std::cout << ss.str();
std::unordered_map< ExchangeType, std::unordered_map< uint32_t, boost::posix_time::ptime >, EnumClassHash > start_times_
A map xchg type -> (a map of trans id -> time of sending first packet.