gfe-relnote: In QUIC, adjust cwnd when doing bandwidth resumption in BBR. Protected by gfe2_reloadable_flag_quic_fix_bbr_cwnd_in_bandwidth_resumption.

PiperOrigin-RevId: 245482154
Change-Id: I0bfa7b414dc369925ab55438894b1579f91d0459
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index 1c0d274..163cd22 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -352,6 +352,16 @@
   if (!rtt.IsZero() && (min_rtt_ > rtt || min_rtt_.IsZero())) {
     min_rtt_ = rtt;
   }
+  if (GetQuicReloadableFlag(quic_fix_bbr_cwnd_in_bandwidth_resumption) &&
+      mode_ == STARTUP) {
+    const QuicByteCount new_cwnd =
+        std::min(kMaxInitialCongestionWindow * kDefaultTCPMSS,
+                 bandwidth * rtt_stats_->SmoothedOrInitialRtt());
+    if (new_cwnd > congestion_window_) {
+      QUIC_RELOADABLE_FLAG_COUNT(quic_fix_bbr_cwnd_in_bandwidth_resumption);
+    }
+    congestion_window_ = std::max(new_cwnd, congestion_window_);
+  }
 }
 
 void BbrSender::OnCongestionEvent(bool /*rtt_updated*/,
diff --git a/quic/core/quic_constants.h b/quic/core/quic_constants.h
index 67cd860..a18c07b 100644
--- a/quic/core/quic_constants.h
+++ b/quic/core/quic_constants.h
@@ -57,6 +57,9 @@
 // We match SPDY's use of 32 (since we'd compete with SPDY).
 const QuicPacketCount kInitialCongestionWindow = 32;
 
+// Do not allow initial congestion window to be greater than 200 packets.
+const QuicPacketCount kMaxInitialCongestionWindow = 200;
+
 // Minimum size of initial flow control window, for both stream and session.
 const uint32_t kMinimumFlowControlSendWindow = 16 * 1024;  // 16 KB
 
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index ad5f297..21dbc14 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -267,9 +267,11 @@
   if (!rtt.IsZero()) {
     SetInitialRtt(rtt);
   }
+  const QuicByteCount old_cwnd = send_algorithm_->GetCongestionWindow();
   send_algorithm_->AdjustNetworkParameters(bandwidth, rtt);
   if (debug_delegate_ != nullptr) {
-    debug_delegate_->OnAdjustNetworkParameters(bandwidth, rtt);
+    debug_delegate_->OnAdjustNetworkParameters(
+        bandwidth, rtt, old_cwnd, send_algorithm_->GetCongestionWindow());
   }
 }
 
diff --git a/quic/core/quic_sent_packet_manager.h b/quic/core/quic_sent_packet_manager.h
index f2524a1..04fab58 100644
--- a/quic/core/quic_sent_packet_manager.h
+++ b/quic/core/quic_sent_packet_manager.h
@@ -70,7 +70,9 @@
     virtual void OnApplicationLimited() {}
 
     virtual void OnAdjustNetworkParameters(QuicBandwidth bandwidth,
-                                           QuicTime::Delta rtt) {}
+                                           QuicTime::Delta rtt,
+                                           QuicByteCount old_cwnd,
+                                           QuicByteCount new_cwnd) {}
   };
 
   // Interface which gets callbacks from the QuicSentPacketManager when
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc
index ec8de8b..6a641fe 100644
--- a/quic/core/quic_sent_packet_manager_test.cc
+++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -2372,6 +2372,8 @@
 
   EXPECT_CALL(*send_algorithm_,
               AdjustNetworkParameters(QuicBandwidth::Zero(), kRtt));
+  EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
+      .Times(testing::AnyNumber());
   manager_.ResumeConnectionState(cached_network_params, false);
   EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
 }
diff --git a/quic/core/quic_trace_visitor.cc b/quic/core/quic_trace_visitor.cc
index 5e152ea..8b1b62a 100644
--- a/quic/core/quic_trace_visitor.cc
+++ b/quic/core/quic_trace_visitor.cc
@@ -278,7 +278,9 @@
 }
 
 void QuicTraceVisitor::OnAdjustNetworkParameters(QuicBandwidth bandwidth,
-                                                 QuicTime::Delta rtt) {
+                                                 QuicTime::Delta rtt,
+                                                 QuicByteCount old_cwnd,
+                                                 QuicByteCount new_cwnd) {
   quic_trace::Event* event = trace_.add_events();
   event->set_time_us(
       ConvertTimestampToRecordedFormat(connection_->clock()->ApproximateNow()));
diff --git a/quic/core/quic_trace_visitor.h b/quic/core/quic_trace_visitor.h
index a70b150..8021865 100644
--- a/quic/core/quic_trace_visitor.h
+++ b/quic/core/quic_trace_visitor.h
@@ -42,7 +42,9 @@
   void OnApplicationLimited() override;
 
   void OnAdjustNetworkParameters(QuicBandwidth bandwidth,
-                                 QuicTime::Delta rtt) override;
+                                 QuicTime::Delta rtt,
+                                 QuicByteCount old_cwnd,
+                                 QuicByteCount new_cwnd) override;
 
   // Returns a mutable pointer to the trace.  The trace is owned by the
   // visitor, but can be moved using Swap() method after the connection is
diff --git a/quic/test_tools/quic_test_utils_test.cc b/quic/test_tools/quic_test_utils_test.cc
index 79d2af8..01791e0 100644
--- a/quic/test_tools/quic_test_utils_test.cc
+++ b/quic/test_tools/quic_test_utils_test.cc
@@ -4,7 +4,7 @@
 
 #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
 
-#include "testing/gtest/include/gtest/gtest-spi.h"
+#include "testing/base/public/gunit-spi.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
 
 namespace quic {