Index: net/quic/congestion_control/send_algorithm_simulator.cc |
diff --git a/net/quic/congestion_control/send_algorithm_simulator.cc b/net/quic/congestion_control/send_algorithm_simulator.cc |
index f08acffce663d4fbc59e88c36b0bc8715ccabc4b..765394342fbaf0c8cee6006480fa820438d4abc5 100644 |
--- a/net/quic/congestion_control/send_algorithm_simulator.cc |
+++ b/net/quic/congestion_control/send_algorithm_simulator.cc |
@@ -26,8 +26,14 @@ const QuicByteCount kPacketSize = 1200; |
SendAlgorithmSimulator::Sender::Sender(SendAlgorithmInterface* send_algorithm, |
RttStats* rtt_stats) |
+ : Sender(send_algorithm, rtt_stats, QuicTime::Delta::Zero()) {} |
+ |
+SendAlgorithmSimulator::Sender::Sender(SendAlgorithmInterface* send_algorithm, |
+ RttStats* rtt_stats, |
+ QuicTime::Delta additional_rtt) |
: send_algorithm(send_algorithm), |
rtt_stats(rtt_stats), |
+ additional_rtt(additional_rtt), |
last_sent(0), |
last_acked(0), |
next_acked(1), |
@@ -38,6 +44,18 @@ SendAlgorithmSimulator::Sender::Sender(SendAlgorithmInterface* send_algorithm, |
last_transfer_bandwidth(QuicBandwidth::Zero()), |
last_transfer_loss_rate(0) {} |
+SendAlgorithmSimulator::Transfer::Transfer(Sender* sender, |
+ QuicByteCount num_bytes, |
+ QuicTime start_time, |
+ string name) |
+ : sender(sender), |
+ num_bytes(num_bytes), |
+ bytes_acked(0), |
+ bytes_lost(0), |
+ bytes_in_flight(0), |
+ start_time(start_time), |
+ name(name) {} |
+ |
SendAlgorithmSimulator::SendAlgorithmSimulator( |
MockClock* clock, |
QuicBandwidth bandwidth, |
@@ -59,12 +77,13 @@ SendAlgorithmSimulator::SendAlgorithmSimulator( |
SendAlgorithmSimulator::~SendAlgorithmSimulator() {} |
void SendAlgorithmSimulator::AddTransfer(Sender* sender, size_t num_bytes) { |
- AddTransfer(sender, num_bytes, clock_->Now()); |
+ AddTransfer(sender, num_bytes, clock_->Now(), |
+ StringPrintf("#%zu", pending_transfers_.size())); |
} |
void SendAlgorithmSimulator::AddTransfer( |
- Sender* sender, size_t num_bytes, QuicTime start_time) { |
- pending_transfers_.push_back(Transfer(sender, num_bytes, start_time)); |
+ Sender* sender, size_t num_bytes, QuicTime start_time, string name) { |
+ pending_transfers_.push_back(Transfer(sender, num_bytes, start_time, name)); |
// Record initial stats from when the transfer begins. |
pending_transfers_.back().sender->RecordStats(); |
} |
@@ -102,8 +121,9 @@ void SendAlgorithmSimulator::TransferBytes(QuicByteCount max_bytes, |
clock_->AdvanceTime(ack_event.time_delta); |
HandlePendingAck(ack_event.transfer); |
} else { |
- DVLOG(1) << "Sending, advancing time:" |
- << send_event.time_delta.ToMicroseconds() << "us"; |
+ DVLOG(1) << "Sending transfer '" << send_event.transfer->name |
+ << "', advancing time:" << send_event.time_delta.ToMicroseconds() |
+ << "us"; |
clock_->AdvanceTime(send_event.time_delta); |
SendDataNow(send_event.transfer); |
bytes_sent += kPacketSize; |
@@ -133,7 +153,8 @@ SendAlgorithmSimulator::PacketEvent SendAlgorithmSimulator::NextSendEvent() { |
} |
} |
DVLOG(1) << "NextSendTime returning delta(ms):" |
- << next_send_time.ToMilliseconds(); |
+ << next_send_time.ToMilliseconds() << ", transfer '" |
+ << transfer->name; |
return PacketEvent(next_send_time, transfer); |
} |
@@ -213,10 +234,9 @@ QuicTime::Delta SendAlgorithmSimulator::FindNextAck( |
ack_delay = ack_delay.Add(delayed_ack_timer_); |
} |
- DVLOG(1) << "FindNextAcked found next_acked_:" |
- << transfer->sender->next_acked |
+ DVLOG(1) << "FindNextAck found next_acked_:" << transfer->sender->next_acked |
<< " last_acked:" << transfer->sender->last_acked |
- << " ack_delay(ms):" << ack_delay.ToMilliseconds(); |
+ << " ack_time(ms):" << ack_delay.ToMilliseconds(); |
return ack_delay; |
} |
@@ -248,9 +268,9 @@ void SendAlgorithmSimulator::HandlePendingAck(Transfer* transfer) { |
SendAlgorithmInterface::CongestionVector acked_packets; |
SendAlgorithmInterface::CongestionVector lost_packets; |
DVLOG(1) << "Acking packets from:" << sender->last_acked |
- << " to " << sender->next_acked |
- << " bytes_in_flight:" << transfer->bytes_in_flight |
- << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms"; |
+ << " to " << sender->next_acked |
+ << " bytes_in_flight:" << transfer->bytes_in_flight |
+ << " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms"; |
// Some entries may be missing from the sent_packets_ array, if they were |
// dropped due to buffer overruns. |
SentPacket largest_observed; |
@@ -282,7 +302,7 @@ void SendAlgorithmSimulator::HandlePendingAck(Transfer* transfer) { |
sent_packets_.erase(it++); |
} |
- DCHECK(largest_observed.ack_time.IsInitialized()); |
+ DCHECK(!largest_observed.lost); |
DVLOG(1) << "Updating RTT from send_time:" |
<< largest_observed.send_time.ToDebuggingValue() << " to ack_time:" |
<< largest_observed.ack_time.ToDebuggingValue(); |
@@ -327,7 +347,9 @@ void SendAlgorithmSimulator::SendDataNow(Transfer* transfer) { |
Sender* sender = transfer->sender; |
++sender->last_sent; |
DVLOG(1) << "Sending packet:" << sender->last_sent |
+ << " name:" << transfer->name |
<< " bytes_in_flight:" << transfer->bytes_in_flight |
+ << " cwnd:" << sender->send_algorithm->GetCongestionWindow() |
<< " Now():" << (clock_->Now().ToDebuggingValue() / 1000) << "ms"; |
sender->send_algorithm->OnPacketSent( |
clock_->Now(), transfer->bytes_in_flight, |
@@ -344,12 +366,12 @@ void SendAlgorithmSimulator::SendDataNow(Transfer* transfer) { |
packet_lost = true; |
} |
DVLOG(1) << "losing packet:" << sender->last_sent |
- << " due to random loss."; |
+ << " name:" << transfer->name << " due to random loss."; |
// If the number of bytes in flight are less than the bdp, there's |
// no buffering delay. Bytes lost from the buffer are not counted. |
QuicByteCount bdp = bandwidth_.ToBytesPerPeriod(rtt_); |
- QuicTime ack_time = clock_->Now().Add(rtt_); |
+ QuicTime ack_time = clock_->Now().Add(rtt_).Add(sender->additional_rtt); |
if (kPacketSize > bdp) { |
ack_time = ack_time.Add(bandwidth_.TransferTime(kPacketSize - bdp)); |
} |
@@ -360,7 +382,7 @@ void SendAlgorithmSimulator::SendDataNow(Transfer* transfer) { |
sender->last_sent, clock_->Now(), ack_time, packet_lost, transfer)); |
} else { |
DVLOG(1) << "losing packet:" << sender->last_sent |
- << " because the buffer was full."; |
+ << " name:" << transfer->name << " because the buffer was full."; |
} |
transfer->bytes_in_flight += kPacketSize; |
} |