Let QuicReceivedPacketManager trim ack ranges when packet is received, instead of when sending acks.
Protected by FLAGS_quic_rpm_trim_ack_ranges_early.
PiperOrigin-RevId: 547664172
diff --git a/quiche/quic/core/quic_received_packet_manager.cc b/quiche/quic/core/quic_received_packet_manager.cc
index 6b566f4..b941e8c 100644
--- a/quiche/quic/core/quic_received_packet_manager.cc
+++ b/quiche/quic/core/quic_received_packet_manager.cc
@@ -14,6 +14,7 @@
#include "quiche/quic/core/quic_connection_stats.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/platform/api/quic_bug_tracker.h"
+#include "quiche/quic/platform/api/quic_flag_utils.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_logging.h"
@@ -104,6 +105,7 @@
time_largest_observed_ = receipt_time;
}
ack_frame_.packets.Add(packet_number);
+ MaybeTrimAckRanges();
if (save_timestamps_) {
// The timestamp format only handles packets in time order.
@@ -151,6 +153,19 @@
}
}
+void QuicReceivedPacketManager::MaybeTrimAckRanges() {
+ if (!trim_ack_ranges_early_) {
+ return;
+ }
+
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_rpm_trim_ack_ranges_early, 1, 2);
+ while (max_ack_ranges_ > 0 &&
+ ack_frame_.packets.NumIntervals() > max_ack_ranges_) {
+ QUIC_RELOADABLE_FLAG_COUNT_N(quic_rpm_trim_ack_ranges_early, 2, 2);
+ ack_frame_.packets.RemoveSmallestInterval();
+ }
+}
+
bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) {
return LargestAcked(ack_frame_).IsInitialized() &&
packet_number < LargestAcked(ack_frame_) &&