For QUIC BBRv2 STARTUP, factor out two pre-conditions to check bandwidth growth and losses: !full_bandwidth_reached_ && congestion_event.end_of_round_trip.
The goal is to make cl/336154008 cleaner and easier to review.
PiperOrigin-RevId: 336558917
Change-Id: Ie03bab3f895035e6803eac43f4b684611f9ff140
diff --git a/quic/core/congestion_control/bbr2_startup.cc b/quic/core/congestion_control/bbr2_startup.cc
index c134765..72ad66f 100644
--- a/quic/core/congestion_control/bbr2_startup.cc
+++ b/quic/core/congestion_control/bbr2_startup.cc
@@ -43,9 +43,13 @@
const AckedPacketVector& /*acked_packets*/,
const LostPacketVector& /*lost_packets*/,
const Bbr2CongestionEvent& congestion_event) {
- CheckFullBandwidthReached(congestion_event);
+ if (!full_bandwidth_reached_ && congestion_event.end_of_round_trip) {
+ if (!congestion_event.last_sample_is_app_limited) {
+ CheckBandwidthGrowth(congestion_event);
+ }
- CheckExcessiveLosses(congestion_event);
+ CheckExcessiveLosses(congestion_event);
+ }
model_->set_pacing_gain(Params().startup_pacing_gain);
model_->set_cwnd_gain(Params().startup_cwnd_gain);
@@ -54,49 +58,43 @@
return full_bandwidth_reached_ ? Bbr2Mode::DRAIN : Bbr2Mode::STARTUP;
}
-void Bbr2StartupMode::CheckFullBandwidthReached(
+bool Bbr2StartupMode::CheckBandwidthGrowth(
const Bbr2CongestionEvent& congestion_event) {
DCHECK(!full_bandwidth_reached_);
- if (full_bandwidth_reached_ || !congestion_event.end_of_round_trip ||
- congestion_event.last_sample_is_app_limited) {
- return;
- }
+ DCHECK(congestion_event.end_of_round_trip);
+ DCHECK(!congestion_event.last_sample_is_app_limited);
QuicBandwidth threshold =
full_bandwidth_baseline_ * Params().startup_full_bw_threshold;
if (model_->MaxBandwidth() >= threshold) {
- QUIC_DVLOG(3)
- << sender_
- << " CheckFullBandwidthReached at end of round. max_bandwidth:"
- << model_->MaxBandwidth() << ", threshold:" << threshold
- << " (Still growing) @ " << congestion_event.event_time;
+ QUIC_DVLOG(3) << sender_
+ << " CheckBandwidthGrowth at end of round. max_bandwidth:"
+ << model_->MaxBandwidth() << ", threshold:" << threshold
+ << " (Still growing) @ " << congestion_event.event_time;
full_bandwidth_baseline_ = model_->MaxBandwidth();
rounds_without_bandwidth_growth_ = 0;
- return;
+ return true;
}
++rounds_without_bandwidth_growth_;
full_bandwidth_reached_ =
rounds_without_bandwidth_growth_ >= Params().startup_full_bw_rounds;
QUIC_DVLOG(3) << sender_
- << " CheckFullBandwidthReached at end of round. max_bandwidth:"
+ << " CheckBandwidthGrowth at end of round. max_bandwidth:"
<< model_->MaxBandwidth() << ", threshold:" << threshold
<< " rounds_without_growth:" << rounds_without_bandwidth_growth_
<< " full_bw_reached:" << full_bandwidth_reached_ << " @ "
<< congestion_event.event_time;
+
+ return false;
}
void Bbr2StartupMode::CheckExcessiveLosses(
const Bbr2CongestionEvent& congestion_event) {
- if (full_bandwidth_reached_) {
- return;
- }
+ DCHECK(congestion_event.end_of_round_trip);
- // TODO(wub): In TCP, loss based exit only happens at end of a loss round, in
- // QUIC we use the end of the normal round here. It is possible to exit after
- // any congestion event, using information of the "rolling round".
- if (!congestion_event.end_of_round_trip) {
+ if (full_bandwidth_reached_) {
return;
}
diff --git a/quic/core/congestion_control/bbr2_startup.h b/quic/core/congestion_control/bbr2_startup.h
index 378a4fd..75ec71e 100644
--- a/quic/core/congestion_control/bbr2_startup.h
+++ b/quic/core/congestion_control/bbr2_startup.h
@@ -58,7 +58,12 @@
private:
const Bbr2Params& Params() const;
- void CheckFullBandwidthReached(const Bbr2CongestionEvent& congestion_event);
+ // Check bandwidth growth in the past round. Must be called at the end of a
+ // round.
+ // Return true if the bandwidth growed as expected.
+ // Return false otherwise, if enough rounds have elapsed without expected
+ // growth, also sets |full_bandwidth_reached_| to true.
+ bool CheckBandwidthGrowth(const Bbr2CongestionEvent& congestion_event);
void CheckExcessiveLosses(const Bbr2CongestionEvent& congestion_event);