In QUIC BBRv2, use inflight byte after congestion event to detect queuing during PROBE_UP.
Protected by quic_reloadable_flag_quic_bbr2_use_post_inflight_to_detect_queuing.
PiperOrigin-RevId: 332262071
Change-Id: Ib057f75556f9b3bfe9873d5a538b938d6d38ba03
diff --git a/quic/core/congestion_control/bbr2_probe_bw.cc b/quic/core/congestion_control/bbr2_probe_bw.cc
index 59e6303..8cf8b2e 100644
--- a/quic/core/congestion_control/bbr2_probe_bw.cc
+++ b/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -436,10 +436,16 @@
QuicByteCount queuing_threshold =
(Params().probe_bw_probe_inflight_gain * bdp) +
queuing_threshold_extra_bytes;
- is_queuing = prior_in_flight >= queuing_threshold;
+ if (GetQuicReloadableFlag(quic_bbr2_use_post_inflight_to_detect_queuing)) {
+ is_queuing = congestion_event.bytes_in_flight >= queuing_threshold;
+ } else {
+ is_queuing = prior_in_flight >= queuing_threshold;
+ }
QUIC_DVLOG(3) << sender_
<< " Checking if building up a queue. prior_in_flight:"
- << prior_in_flight << ", threshold:" << queuing_threshold
+ << prior_in_flight
+ << ", post_in_flight:" << congestion_event.bytes_in_flight
+ << ", threshold:" << queuing_threshold
<< ", is_queuing:" << is_queuing
<< ", max_bw:" << model_->MaxBandwidth()
<< ", min_rtt:" << model_->MinRtt();
diff --git a/quic/core/congestion_control/bbr2_simulator_test.cc b/quic/core/congestion_control/bbr2_simulator_test.cc
index 2036eb1..1f5db20 100644
--- a/quic/core/congestion_control/bbr2_simulator_test.cc
+++ b/quic/core/congestion_control/bbr2_simulator_test.cc
@@ -661,10 +661,10 @@
}
// Now that in-flight is almost zero and the pacing gain is still above 1,
- // send approximately 1.25 BDPs worth of data. This should cause the
- // PROBE_BW mode to enter low gain cycle(PROBE_DOWN), and exit it earlier than
- // one min_rtt due to running out of data to send.
- sender_endpoint_.AddBytesToTransfer(1.3 * params.BDP());
+ // send approximately 1.4 BDPs worth of data. This should cause the PROBE_BW
+ // mode to enter low gain cycle(PROBE_DOWN), and exit it earlier than one
+ // min_rtt due to running out of data to send.
+ sender_endpoint_.AddBytesToTransfer(1.4 * params.BDP());
simulator_result = simulator_.RunUntilOrTimeout(
[this]() {
return sender_->ExportDebugState().probe_bw.phase ==