gfe-relnote: In QUIC, add a multiplier (default to 2) to consider overshooting happens if bytes_lost_with_network_parameters_adjusted_ * bytes_lost_multiplier_with_network_parameters_adjusted_ > IW. Protected by existing gfe2_reloadable_flag_quic_bbr_mitigate_overly_large_bandwidth_sample.
Also add two connection options to set this multiplier to 3 and 4.
PiperOrigin-RevId: 289551442
Change-Id: If22f2f0754362396afa9771b5099790f1655b789
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index a279bc7..3bef1dd 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -137,7 +137,8 @@
app_limited_since_last_probe_rtt_(false),
min_rtt_since_last_probe_rtt_(QuicTime::Delta::Infinite()),
network_parameters_adjusted_(false),
- bytes_lost_with_network_parameters_adjusted_(0) {
+ bytes_lost_with_network_parameters_adjusted_(0),
+ bytes_lost_multiplier_with_network_parameters_adjusted_(2) {
if (stats_) {
// Clear some startup stats if |stats_| has been used by another sender,
// which happens e.g. when QuicConnection switch send algorithms.
@@ -284,6 +285,14 @@
// Hits 1.25x pacing multiplier when ~1/3 CWND is lost.
startup_rate_reduction_multiplier_ = 2;
}
+ if (GetQuicReloadableFlag(quic_bbr_mitigate_overly_large_bandwidth_sample)) {
+ if (config.HasClientRequestedIndependentOption(kBWM3, perspective)) {
+ bytes_lost_multiplier_with_network_parameters_adjusted_ = 3;
+ }
+ if (config.HasClientRequestedIndependentOption(kBWM4, perspective)) {
+ bytes_lost_multiplier_with_network_parameters_adjusted_ = 4;
+ }
+ }
if (config.HasClientRequestedIndependentOption(kBBR4, perspective)) {
sampler_.SetMaxAckHeightTrackerWindowLength(2 * kBandwidthWindowSize);
}
@@ -846,7 +855,8 @@
QUIC_RELOADABLE_FLAG_COUNT_N(
quic_bbr_mitigate_overly_large_bandwidth_sample, 2, 4);
if (has_non_app_limited_sample_ ||
- bytes_lost_with_network_parameters_adjusted_ * 2 >
+ bytes_lost_with_network_parameters_adjusted_ *
+ bytes_lost_multiplier_with_network_parameters_adjusted_ >
initial_congestion_window_) {
// We are fairly sure overshoot happens if 1) there is at least one
// non app-limited bw sample or 2) half of IW gets lost. Slow pacing
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index db0f330..3db423d 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -398,6 +398,10 @@
bool network_parameters_adjusted_;
// Bytes lost after network parameters gets adjusted.
QuicByteCount bytes_lost_with_network_parameters_adjusted_;
+ // Decrease pacing rate after parameters adjusted if
+ // bytes_lost_with_network_parameters_adjusted_ *
+ // bytes_lost_multiplier_with_network_parameters_adjusted_ > IW.
+ uint8_t bytes_lost_multiplier_with_network_parameters_adjusted_;
};
QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index 1a6e5f2..a1d7d76 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -241,6 +241,12 @@
const QuicTag kBWS7 = TAG('B', 'W', 'S', '7'); // QUIC Initial CWND - Enabled
// with 0.75 * default
// multiplier.
+const QuicTag kBWM3 = TAG('B', 'W', 'M', '3'); // Consider overshooting if
+ // bytes lost after bandwidth
+ // resumption * 3 > IW.
+const QuicTag kBWM4 = TAG('B', 'W', 'M', '4'); // Consider overshooting if
+ // bytes lost after bandwidth
+ // resumption * 4 > IW.
// Enable path MTU discovery experiment.
const QuicTag kMTUH = TAG('M', 'T', 'U', 'H'); // High-target MTU discovery.