Simplify the usage of ack_frequency and ack_delay in quic_received_packet_manager. flag protected by gfe2_reloadable_flag_quic_simplify_received_packet_manager_ack.
A few other no-op changes:
1) Renamed ack_frequency_before_decimation to ack_frequency_.
2) Removed a few unused getters in uber_received_packet_manager and quic_connection.
PiperOrigin-RevId: 323473745
Change-Id: I51f119d048271543b5a7ae000d3d4bcffc3679ab
diff --git a/quic/core/quic_received_packet_manager.cc b/quic/core/quic_received_packet_manager.cc
index 324767c..9cc6c29 100644
--- a/quic/core/quic_received_packet_manager.cc
+++ b/quic/core/quic_received_packet_manager.cc
@@ -44,8 +44,7 @@
ack_mode_(ACK_DECIMATION),
num_retransmittable_packets_received_since_last_ack_sent_(0),
min_received_before_ack_decimation_(kMinReceivedBeforeAckDecimation),
- ack_frequency_before_ack_decimation_(
- kDefaultRetransmittablePacketsBeforeAck),
+ ack_frequency_(kDefaultRetransmittablePacketsBeforeAck),
ack_decimation_delay_(kAckDecimationDelay),
unlimited_ack_decimation_(false),
fast_ack_after_quiescence_(false),
@@ -216,6 +215,38 @@
ack_frame_.packets.Min() >= peer_least_packet_awaiting_ack_);
}
+QuicTime::Delta QuicReceivedPacketManager::GetMaxAckDelay(
+ QuicPacketNumber last_received_packet_number,
+ const RttStats& rtt_stats) const {
+ DCHECK(simplify_received_packet_manager_ack_);
+ if (last_received_packet_number <
+ PeerFirstSendingPacketNumber() + min_received_before_ack_decimation_) {
+ return local_max_ack_delay_;
+ }
+
+ // Wait for the minimum of the ack decimation delay or the delayed ack time
+ // before sending an ack.
+ QuicTime::Delta ack_delay = std::min(
+ local_max_ack_delay_, rtt_stats.min_rtt() * ack_decimation_delay_);
+ if (GetQuicReloadableFlag(quic_ack_delay_alarm_granularity)) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_ack_delay_alarm_granularity);
+ ack_delay = std::max(ack_delay, kAlarmGranularity);
+ }
+ return ack_delay;
+}
+
+void QuicReceivedPacketManager::MaybeUpdateAckFrequency(
+ QuicPacketNumber last_received_packet_number) {
+ DCHECK(simplify_received_packet_manager_ack_);
+ if (last_received_packet_number <
+ PeerFirstSendingPacketNumber() + min_received_before_ack_decimation_) {
+ return;
+ }
+ ack_frequency_ = unlimited_ack_decimation_
+ ? std::numeric_limits<size_t>::max()
+ : kMaxRetransmittablePacketsBeforeAck;
+}
+
void QuicReceivedPacketManager::MaybeUpdateAckTimeout(
bool should_last_packet_instigate_acks,
QuicPacketNumber last_received_packet_number,
@@ -240,6 +271,26 @@
}
++num_retransmittable_packets_received_since_last_ack_sent_;
+
+ if (simplify_received_packet_manager_ack_) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_simplify_received_packet_manager_ack);
+ MaybeUpdateAckFrequency(last_received_packet_number);
+ if (num_retransmittable_packets_received_since_last_ack_sent_ >=
+ ack_frequency_) {
+ ack_timeout_ = now;
+ return;
+ }
+
+ if (HasNewMissingPackets()) {
+ ack_timeout_ = now;
+ return;
+ }
+
+ MaybeUpdateAckTimeoutTo(
+ now + GetMaxAckDelay(last_received_packet_number, *rtt_stats));
+ return;
+ }
+
if (ack_mode_ != TCP_ACKING &&
last_received_packet_number >= PeerFirstSendingPacketNumber() +
min_received_before_ack_decimation_) {
@@ -269,7 +320,7 @@
} else {
// Ack with a timer or every 2 packets by default.
if (num_retransmittable_packets_received_since_last_ack_sent_ >=
- ack_frequency_before_ack_decimation_) {
+ ack_frequency_) {
ack_timeout_ = now;
} else if (fast_ack_after_quiescence_ &&
(now - time_of_previous_received_packet_) >