gfe-relnote: In QUIC, use 2 burst tokens in bootstrapping experiment, protected by gfe2_reloadable_flag_quic_conservative_bursts. Also decrease cwnd gain and pacing gain. PiperOrigin-RevId: 247919205 Change-Id: Ic3a205e6f0ec8e23d3f17db9f8b252fd9638d08c
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc index 004ec91..7d7258f 100644 --- a/quic/core/congestion_control/bbr_sender.cc +++ b/quic/core/congestion_control/bbr_sender.cc
@@ -355,12 +355,14 @@ if (new_cwnd > congestion_window_) { QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_bbr_cwnd_in_bandwidth_resumption, 1, 2); - // Decrease cwnd gain when cwnd increases. - set_high_cwnd_gain(kDerivedHighCWNDGain); } else { QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_bbr_cwnd_in_bandwidth_resumption, 2, 2); } + // Decreases cwnd gain and pacing gain. Please note, if pacing_rate_ has + // been calculated, it cannot decrease in STARTUP phase. + set_high_gain(kDerivedHighCWNDGain); + set_high_cwnd_gain(kDerivedHighCWNDGain); congestion_window_ = std::max(new_cwnd, congestion_window_); } }
diff --git a/quic/core/congestion_control/pacing_sender.cc b/quic/core/congestion_control/pacing_sender.cc index 53d5096..0968935 100644 --- a/quic/core/congestion_control/pacing_sender.cc +++ b/quic/core/congestion_control/pacing_sender.cc
@@ -122,6 +122,13 @@ pacing_limited_ = false; } +void PacingSender::SetBurstTokens(uint32_t burst_tokens) { + initial_burst_size_ = burst_tokens; + burst_tokens_ = std::min( + initial_burst_size_, + static_cast<uint32_t>(sender_->GetCongestionWindow() / kDefaultTCPMSS)); +} + QuicTime::Delta PacingSender::TimeUntilSend( QuicTime now, QuicByteCount bytes_in_flight) const {
diff --git a/quic/core/congestion_control/pacing_sender.h b/quic/core/congestion_control/pacing_sender.h index 8420c7f..781a921 100644 --- a/quic/core/congestion_control/pacing_sender.h +++ b/quic/core/congestion_control/pacing_sender.h
@@ -66,6 +66,9 @@ // making up for lost time. void OnApplicationLimited(); + // Set burst_tokens_ and initial_burst_size_. + void SetBurstTokens(uint32_t burst_tokens); + QuicTime::Delta TimeUntilSend(QuicTime now, QuicByteCount bytes_in_flight) const;
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc index 865cf3f..061ebac 100644 --- a/quic/core/quic_sent_packet_manager.cc +++ b/quic/core/quic_sent_packet_manager.cc
@@ -66,6 +66,11 @@ transmission_type == RTO_RETRANSMISSION; } +// If pacing rate is accurate, > 2 burst token is not likely to help first ACK +// to arrive earlier, and overly large burst token could cause incast packet +// losses. +static const uint32_t kConservativeUnpacedBurst = 2; + } // namespace #define ENDPOINT \ @@ -268,6 +273,10 @@ SetInitialRtt(rtt); } const QuicByteCount old_cwnd = send_algorithm_->GetCongestionWindow(); + if (GetQuicReloadableFlag(quic_conservative_bursts) && using_pacing_) { + QUIC_RELOADABLE_FLAG_COUNT(quic_conservative_bursts); + pacing_sender_.SetBurstTokens(kConservativeUnpacedBurst); + } send_algorithm_->AdjustNetworkParameters(bandwidth, rtt); if (debug_delegate_ != nullptr) { debug_delegate_->OnAdjustNetworkParameters(