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.