Internal QUICHE change PiperOrigin-RevId: 290129985 Change-Id: I23d112a79b77da8084c078e9ed2b34d7cc07e863
diff --git a/quic/core/congestion_control/bbr2_probe_bw.cc b/quic/core/congestion_control/bbr2_probe_bw.cc index 781e218..3c8c787 100644 --- a/quic/core/congestion_control/bbr2_probe_bw.cc +++ b/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -217,8 +217,15 @@ bool Bbr2ProbeBwMode::IsTimeToProbeBandwidth( const Bbr2CongestionEvent& congestion_event) const { - return HasCycleLasted(cycle_.probe_wait_time, congestion_event) || - IsTimeToProbeForRenoCoexistence(1.0, congestion_event); + if (HasCycleLasted(cycle_.probe_wait_time, congestion_event)) { + return true; + } + + if (IsTimeToProbeForRenoCoexistence(1.0, congestion_event)) { + ++sender_->connection_stats_->bbr_num_short_cycles_for_reno_coexistence; + return true; + } + return false; } // QUIC only. Used to prevent a Bbr2 flow from staying in PROBE_DOWN for too @@ -429,6 +436,7 @@ cycle_.phase = CyclePhase::PROBE_DOWN; cycle_.rounds_in_phase = 0; cycle_.phase_start_time = congestion_event.event_time; + ++sender_->connection_stats_->bbr_num_cycles; // Pick probe wait time. cycle_.rounds_since_probe =
diff --git a/quic/core/congestion_control/bbr2_startup.cc b/quic/core/congestion_control/bbr2_startup.cc index 090dd40..c87f715 100644 --- a/quic/core/congestion_control/bbr2_startup.cc +++ b/quic/core/congestion_control/bbr2_startup.cc
@@ -130,6 +130,7 @@ model_->set_inflight_hi(bdp); full_bandwidth_reached_ = true; + sender_->connection_stats_->bbr_exit_startup_due_to_loss = true; } loss_events_in_round_ = 0;
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc index b4566bd..358006d 100644 --- a/quic/core/congestion_control/bbr_sender.cc +++ b/quic/core/congestion_control/bbr_sender.cc
@@ -713,6 +713,9 @@ if (should_advance_gain_cycling) { cycle_current_offset_ = (cycle_current_offset_ + 1) % kGainCycleLength; + if (cycle_current_offset_ == 0) { + ++stats_->bbr_num_cycles; + } last_cycle_start_ = now; // Stay in low gain mode until the target BDP is hit. // Low gain mode will be exited immediately when the target BDP is achieved. @@ -785,9 +788,13 @@ const QuicByteCount inflight_at_send = last_packet_send_state.bytes_in_flight; if (inflight_at_send > 0 && bytes_lost_in_round_ > 0) { - return bytes_lost_in_round_ > - inflight_at_send * - GetQuicFlag(FLAGS_quic_bbr2_default_loss_threshold); + if (bytes_lost_in_round_ > + inflight_at_send * + GetQuicFlag(FLAGS_quic_bbr2_default_loss_threshold)) { + stats_->bbr_exit_startup_due_to_loss = true; + return true; + } + return false; } return false;
diff --git a/quic/core/quic_connection_stats.h b/quic/core/quic_connection_stats.h index 7015554..a99c055 100644 --- a/quic/core/quic_connection_stats.h +++ b/quic/core/quic_connection_stats.h
@@ -15,6 +15,7 @@ #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" namespace quic { + // Structure to hold stats for a QuicConnection. struct QUIC_EXPORT_PRIVATE QuicConnectionStats { QUIC_EXPORT_PRIVATE friend std::ostream& operator<<( @@ -60,6 +61,14 @@ // Time spent in slow start. Populated for BBRv1 and BBRv2. QuicTimeAccumulator slowstart_duration; + // Number of PROBE_BW cycles. Populated for BBRv1 and BBRv2. + uint32_t bbr_num_cycles = 0; + // Number of PROBE_BW cycles shortened for reno coexistence. BBRv2 only. + uint32_t bbr_num_short_cycles_for_reno_coexistence = 0; + // Whether BBR exited STARTUP due to excessive loss. Populated for BBRv1 and + // BBRv2. + bool bbr_exit_startup_due_to_loss = false; + QuicPacketCount packets_dropped = 0; // Duplicate or less than least unacked. // Packets that failed to decrypt when they were first received,