gfe-relnote: Save the time the last inflight packet was sent instead of iterating through the deque. Protected by gfe2_reloadable_flag_quic_simple_inflight_time.
PiperOrigin-RevId: 267115183
Change-Id: I98661c317b4009e182ecbec9e25c8fd368791758
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index 2eb606b..54e6444 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -645,7 +645,7 @@
// Other crypto handshake packets won't be in flight, only the newest
// transmission of a crypto packet is in flight at once.
// TODO(ianswett): Instead of handling all crypto packets special,
- // only handle nullptr encrypted packets in a special way.
+ // only handle null encrypted packets in a special way.
const QuicTransmissionInfo& newest_transmission_info =
unacked_packets_.GetTransmissionInfo(newest_transmission);
unacked_packets_.NotifyFramesAcked(newest_transmission_info, ack_delay_time,
@@ -1021,7 +1021,8 @@
// TODO(ianswett): When CWND is available, it would be preferable to
// set the timer based on the earliest retransmittable packet.
// Base the updated timer on the send time of the last packet.
- const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime();
+ const QuicTime sent_time =
+ unacked_packets_.GetLastInFlightPacketSentTime();
const QuicTime tlp_time = sent_time + GetTailLossProbeDelay();
// Ensure the TLP timer never gets set to a time in the past.
return std::max(clock_->ApproximateNow(), tlp_time);
@@ -1029,15 +1030,16 @@
case RTO_MODE: {
DCHECK(!pto_enabled_);
// The RTO is based on the first outstanding packet.
- const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime();
+ const QuicTime sent_time =
+ unacked_packets_.GetLastInFlightPacketSentTime();
QuicTime rto_time = sent_time + GetRetransmissionDelay();
// Wait for TLP packets to be acked before an RTO fires.
- QuicTime tlp_time =
- unacked_packets_.GetLastPacketSentTime() + GetTailLossProbeDelay();
+ QuicTime tlp_time = sent_time + GetTailLossProbeDelay();
return std::max(tlp_time, rto_time);
}
case PTO_MODE: {
- if (handshake_mode_disabled_ && !handshake_confirmed_ &&
+ if (!unacked_packets().simple_inflight_time() &&
+ handshake_mode_disabled_ && !handshake_confirmed_ &&
!unacked_packets_.HasInFlightPackets()) {
DCHECK_EQ(Perspective::IS_CLIENT, unacked_packets_.perspective());
return std::max(clock_->ApproximateNow(),
@@ -1045,9 +1047,9 @@
GetProbeTimeoutDelay());
}
// Ensure PTO never gets set to a time in the past.
- return std::max(
- clock_->ApproximateNow(),
- unacked_packets_.GetLastPacketSentTime() + GetProbeTimeoutDelay());
+ return std::max(clock_->ApproximateNow(),
+ unacked_packets_.GetLastInFlightPacketSentTime() +
+ GetProbeTimeoutDelay());
}
}
DCHECK(false);
diff --git a/quic/core/quic_unacked_packet_map.cc b/quic/core/quic_unacked_packet_map.cc
index f07fd31..92f3171 100644
--- a/quic/core/quic_unacked_packet_map.cc
+++ b/quic/core/quic_unacked_packet_map.cc
@@ -29,10 +29,14 @@
least_unacked_(FirstSendingPacketNumber()),
bytes_in_flight_(0),
pending_crypto_packet_count_(0),
+ last_inflight_packet_sent_time_(QuicTime::Zero()),
last_crypto_packet_sent_time_(QuicTime::Zero()),
session_notifier_(nullptr),
session_decides_what_to_write_(false),
- supports_multiple_packet_number_spaces_(false) {}
+ supports_multiple_packet_number_spaces_(false),
+ simple_inflight_time_(GetQuicReloadableFlag(quic_simple_inflight_time)) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_simple_inflight_time);
+}
QuicUnackedPacketMap::~QuicUnackedPacketMap() {
for (QuicTransmissionInfo& transmission_info : unacked_packets_) {
@@ -79,6 +83,9 @@
info.in_flight = true;
largest_sent_retransmittable_packets_[GetPacketNumberSpace(
info.encryption_level)] = packet_number;
+ // TODO(ianswett): Should this field be per packet number space or should
+ // GetInFlightPacketSentTime() use largest_sent_retransmittable_packets_?
+ last_inflight_packet_sent_time_ = sent_time;
}
unacked_packets_.push_back(info);
// Swap the retransmittable frames to avoid allocations.
@@ -321,7 +328,10 @@
return &unacked_packets_[packet_number - least_unacked_];
}
-QuicTime QuicUnackedPacketMap::GetLastPacketSentTime() const {
+QuicTime QuicUnackedPacketMap::GetLastInFlightPacketSentTime() const {
+ if (simple_inflight_time_) {
+ return last_inflight_packet_sent_time_;
+ }
auto it = unacked_packets_.rbegin();
while (it != unacked_packets_.rend()) {
if (it->in_flight) {
diff --git a/quic/core/quic_unacked_packet_map.h b/quic/core/quic_unacked_packet_map.h
index 64d1da8..864e485 100644
--- a/quic/core/quic_unacked_packet_map.h
+++ b/quic/core/quic_unacked_packet_map.h
@@ -131,7 +131,7 @@
QuicPacketNumber packet_number);
// Returns the time that the last unacked packet was sent.
- QuicTime GetLastPacketSentTime() const;
+ QuicTime GetLastInFlightPacketSentTime() const;
// Returns the time that the last unacked crypto packet was sent.
QuicTime GetLastCryptoPacketSentTime() const;
@@ -227,6 +227,8 @@
return supports_multiple_packet_number_spaces_;
}
+ bool simple_inflight_time() const { return simple_inflight_time_; }
+
private:
friend class test::QuicUnackedPacketMapPeer;
@@ -288,6 +290,9 @@
// Number of retransmittable crypto handshake packets.
size_t pending_crypto_packet_count_;
+ // Time that the last inflight packet was sent.
+ QuicTime last_inflight_packet_sent_time_;
+
// Time that the last unacked crypto packet was sent.
QuicTime last_crypto_packet_sent_time_;
@@ -303,6 +308,9 @@
// If true, supports multiple packet number spaces.
bool supports_multiple_packet_number_spaces_;
+
+ // Latched value of the quic_simple_inflight_time flag.
+ bool simple_inflight_time_;
};
} // namespace quic