gfe-relnote: In QUIC, do not close connection if received an in-order ACK with decreased largest_acked. Protected by gfe2_reloadable_flag_quic_tolerate_reneging.
By dremel, this connection close occurs rarely in prod: https://screenshot.googleplex.com/jZpfvdY4nzk
Largest_acked can decrease currently in IETF QUIC, though that may change: https://github.com/quicwg/base-drafts/issues/2205
PiperOrigin-RevId: 238228491
Change-Id: If7586fb8da192dea4436a5572c76bb7aeb1a3227
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index 93909b7..e078f5f 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -111,7 +111,11 @@
delayed_ack_time_(
QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs)),
rtt_updated_(false),
- acked_packets_iter_(last_ack_frame_.packets.rbegin()) {
+ acked_packets_iter_(last_ack_frame_.packets.rbegin()),
+ tolerate_reneging_(GetQuicReloadableFlag(quic_tolerate_reneging)) {
+ if (tolerate_reneging_) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_tolerate_reneging);
+ }
SetSendAlgorithm(congestion_control_type);
}
@@ -1063,7 +1067,8 @@
rtt_updated_ =
MaybeUpdateRTT(largest_acked, ack_delay_time, ack_receive_time);
DCHECK(!unacked_packets_.largest_acked().IsInitialized() ||
- largest_acked >= unacked_packets_.largest_acked());
+ largest_acked >= unacked_packets_.largest_acked() ||
+ tolerate_reneging_);
last_ack_frame_.ack_delay_time = ack_delay_time;
acked_packets_iter_ = last_ack_frame_.packets.rbegin();
}