gfe-relnote: For QUIC BBRv2: 1) Don't grow inflight_hi unless it's fully used, and 2) Cap inflight_lo in PROBE_CRUISE. Protected by --gfe2_reloadable_flag_quic_bbr2_fix_inflight_bounds. PiperOrigin-RevId: 271636423 Change-Id: I3eeb334f3d09086c9d546cee3bcb34f005c75d9c
diff --git a/quic/core/congestion_control/bbr2_misc.h b/quic/core/congestion_control/bbr2_misc.h index 4ad351e..bf2c00d 100644 --- a/quic/core/congestion_control/bbr2_misc.h +++ b/quic/core/congestion_control/bbr2_misc.h
@@ -379,6 +379,11 @@ return std::numeric_limits<QuicByteCount>::max(); } void clear_inflight_lo() { inflight_lo_ = inflight_lo_default(); } + void cap_inflight_lo(QuicByteCount cap) { + if (inflight_lo_ != inflight_lo_default() && inflight_lo_ > cap) { + inflight_lo_ = cap; + } + } QuicByteCount inflight_hi_with_headroom() const; QuicByteCount inflight_hi() const { return inflight_hi_; }
diff --git a/quic/core/congestion_control/bbr2_probe_bw.cc b/quic/core/congestion_control/bbr2_probe_bw.cc index ed65cf9..fcaa6a1 100644 --- a/quic/core/congestion_control/bbr2_probe_bw.cc +++ b/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -266,23 +266,40 @@ DCHECK_EQ(cycle_.phase, CyclePhase::PROBE_UP); if (!model_->IsCongestionWindowLimited(congestion_event)) { QUIC_DVLOG(3) << sender_ - << " Rasing inflight_hi early return: Not cwnd limited."; + << " Raising inflight_hi early return: Not cwnd limited."; // Not fully utilizing cwnd, so can't safely grow. return; } + if (GetQuicReloadableFlag(quic_bbr2_fix_inflight_bounds) && + congestion_event.prior_cwnd < model_->inflight_hi()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_bbr2_fix_inflight_bounds, 1, 2); + QUIC_DVLOG(3) + << sender_ + << " Raising inflight_hi early return: inflight_hi not fully used."; + // Not fully using inflight_hi, so don't grow it. + return; + } + // Increase inflight_hi by the number of probe_up_bytes within probe_up_acked. cycle_.probe_up_acked += congestion_event.bytes_acked; if (cycle_.probe_up_acked >= cycle_.probe_up_bytes) { uint64_t delta = cycle_.probe_up_acked / cycle_.probe_up_bytes; cycle_.probe_up_acked -= delta * cycle_.probe_up_bytes; - QUIC_DVLOG(3) << sender_ << " Rasing inflight_hi from " - << model_->inflight_hi() << " to " - << model_->inflight_hi() + delta * kDefaultTCPMSS - << ". probe_up_bytes:" << cycle_.probe_up_bytes - << ", delta:" << delta - << ", (new)probe_up_acked:" << cycle_.probe_up_acked; - model_->set_inflight_hi(model_->inflight_hi() + delta * kDefaultTCPMSS); + QuicByteCount new_inflight_hi = + model_->inflight_hi() + delta * kDefaultTCPMSS; + if (new_inflight_hi > model_->inflight_hi()) { + QUIC_DVLOG(3) << sender_ << " Raising inflight_hi from " + << model_->inflight_hi() << " to " << new_inflight_hi + << ". probe_up_bytes:" << cycle_.probe_up_bytes + << ", delta:" << delta + << ", (new)probe_up_acked:" << cycle_.probe_up_acked; + + model_->set_inflight_hi(new_inflight_hi); + } else { + QUIC_BUG << "Not growing inflight_hi due to wrap around. Old value:" + << model_->inflight_hi() << ", new value:" << new_inflight_hi; + } } if (congestion_event.end_of_round_trip) { @@ -400,6 +417,10 @@ << congestion_event.event_time - cycle_.phase_start_time << ", or " << cycle_.rounds_in_phase << " rounds. @ " << congestion_event.event_time; + if (GetQuicReloadableFlag(quic_bbr2_fix_inflight_bounds)) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_bbr2_fix_inflight_bounds, 2, 2); + model_->cap_inflight_lo(model_->inflight_hi()); + } cycle_.phase = CyclePhase::PROBE_CRUISE; cycle_.rounds_in_phase = 0; cycle_.phase_start_time = congestion_event.event_time;