When switch from QUIC BBR to BBRv2, use BBR's cwnd as the initial cwnd of BBRv2.
Protected by quic_reloadable_flag_quic_copy_bbr_cwnd_to_bbr2.
PiperOrigin-RevId: 330988495
Change-Id: I101432ec8e685a27f310f39ab4aaab98779de420
diff --git a/quic/core/congestion_control/bbr2_sender.cc b/quic/core/congestion_control/bbr2_sender.cc
index 4b2fac8..94cfc1f 100644
--- a/quic/core/congestion_control/bbr2_sender.cc
+++ b/quic/core/congestion_control/bbr2_sender.cc
@@ -73,8 +73,10 @@
/*cwnd_gain=*/1.0,
/*pacing_gain=*/kInitialPacingGain,
old_sender ? &old_sender->sampler_ : nullptr),
- initial_cwnd_(
- cwnd_limits().ApplyLimits(initial_cwnd_in_packets * kDefaultTCPMSS)),
+ initial_cwnd_(cwnd_limits().ApplyLimits(
+ (GetQuicReloadableFlag(quic_copy_bbr_cwnd_to_bbr2) && old_sender)
+ ? old_sender->GetCongestionWindow()
+ : (initial_cwnd_in_packets * kDefaultTCPMSS))),
cwnd_(initial_cwnd_),
pacing_rate_(kInitialPacingGain * QuicBandwidth::FromBytesAndTimeDelta(
cwnd_,
@@ -84,6 +86,10 @@
probe_bw_(this, &model_),
probe_rtt_(this, &model_),
last_sample_is_app_limited_(false) {
+ if (GetQuicReloadableFlag(quic_copy_bbr_cwnd_to_bbr2) && old_sender) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_copy_bbr_cwnd_to_bbr2);
+ }
+
QUIC_DVLOG(2) << this << " Initializing Bbr2Sender. mode:" << mode_
<< ", PacingRate:" << pacing_rate_ << ", Cwnd:" << cwnd_
<< ", CwndLimits:" << cwnd_limits() << " @ " << now;
diff --git a/quic/core/congestion_control/bbr2_simulator_test.cc b/quic/core/congestion_control/bbr2_simulator_test.cc
index 0dcf427..2036eb1 100644
--- a/quic/core/congestion_control/bbr2_simulator_test.cc
+++ b/quic/core/congestion_control/bbr2_simulator_test.cc
@@ -912,7 +912,7 @@
BbrSender old_sender(sender_connection()->clock()->Now(),
sender_connection()->sent_packet_manager().GetRttStats(),
GetUnackedMap(sender_connection()),
- kDefaultInitialCwndPackets,
+ kDefaultInitialCwndPackets + 1,
GetQuicFlag(FLAGS_quic_max_congestion_window), &random_,
QuicConnectionPeer::GetStats(sender_connection()));
@@ -927,7 +927,11 @@
}
// Switch from |old_sender| to |sender_|.
+ const QuicByteCount old_sender_cwnd = old_sender.GetCongestionWindow();
sender_ = SetupBbr2Sender(&sender_endpoint_, &old_sender);
+ if (GetQuicReloadableFlag(quic_copy_bbr_cwnd_to_bbr2)) {
+ EXPECT_EQ(old_sender_cwnd, sender_->GetCongestionWindow());
+ }
// Send packets 5-7.
now = now + QuicTime::Delta::FromMilliseconds(10);