Add the check for enough loss events into the Bbr2NetworkModel::IsInflightTooHigh() method to simplify the code. PiperOrigin-RevId: 336470593 Change-Id: I370b79fd09736d508df1996a47dde4b21d453143
diff --git a/quic/core/congestion_control/bbr2_misc.cc b/quic/core/congestion_control/bbr2_misc.cc index 6053185..9f6744e 100644 --- a/quic/core/congestion_control/bbr2_misc.cc +++ b/quic/core/congestion_control/bbr2_misc.cc
@@ -243,21 +243,29 @@ } bool Bbr2NetworkModel::IsInflightTooHigh( - const Bbr2CongestionEvent& congestion_event) const { + const Bbr2CongestionEvent& congestion_event, + int64_t max_loss_events) const { const SendTimeState& send_state = congestion_event.last_packet_send_state; if (!send_state.is_valid) { // Not enough information. return false; } + if (loss_events_in_round() < max_loss_events) { + return false; + } + const QuicByteCount inflight_at_send = BytesInFlight(send_state); // TODO(wub): Consider total_bytes_lost() - send_state.total_bytes_lost, which // is the total bytes lost when the largest numbered packet was inflight. // bytes_lost_in_round_, OTOH, is the total bytes lost in the "current" round. const QuicByteCount bytes_lost_in_round = bytes_lost_in_round_; - QUIC_DVLOG(3) << "IsInflightTooHigh: bytes_lost_in_round:" - << bytes_lost_in_round << ", lost_in_round_threshold:" + QUIC_DVLOG(3) << "IsInflightTooHigh: loss_events_in_round:" + << loss_events_in_round() + + << " bytes_lost_in_round:" << bytes_lost_in_round + << ", lost_in_round_threshold:" << inflight_at_send * Params().loss_threshold; if (inflight_at_send > 0 && bytes_lost_in_round > 0) {
diff --git a/quic/core/congestion_control/bbr2_misc.h b/quic/core/congestion_control/bbr2_misc.h index f68092b..a6f710a 100644 --- a/quic/core/congestion_control/bbr2_misc.h +++ b/quic/core/congestion_control/bbr2_misc.h
@@ -394,9 +394,10 @@ bool IsCongestionWindowLimited( const Bbr2CongestionEvent& congestion_event) const; - // TODO(wub): Replace this by a new version which takes two thresholds, one - // is the number of loss events, the other is the percentage of bytes lost. - bool IsInflightTooHigh(const Bbr2CongestionEvent& congestion_event) const; + // Return true if the number of loss events exceeds max_loss_events and + // fraction of bytes lost exceed the loss threshold. + bool IsInflightTooHigh(const Bbr2CongestionEvent& congestion_event, + int64_t max_loss_events) const; QuicPacketNumber last_sent_packet() const { return round_trip_counter_.last_sent_packet();
diff --git a/quic/core/congestion_control/bbr2_probe_bw.cc b/quic/core/congestion_control/bbr2_probe_bw.cc index 1729118..fa72d9f 100644 --- a/quic/core/congestion_control/bbr2_probe_bw.cc +++ b/quic/core/congestion_control/bbr2_probe_bw.cc
@@ -199,10 +199,8 @@ return NOT_ADAPTED_INVALID_SAMPLE; } - const bool has_enough_loss_events = - model_->loss_events_in_round() >= Params().probe_bw_full_loss_count; - - if (has_enough_loss_events && model_->IsInflightTooHigh(congestion_event)) { + if (model_->IsInflightTooHigh(congestion_event, + Params().probe_bw_full_loss_count)) { if (cycle_.is_sample_from_probing) { cycle_.is_sample_from_probing = false;
diff --git a/quic/core/congestion_control/bbr2_startup.cc b/quic/core/congestion_control/bbr2_startup.cc index 1141ca0..c134765 100644 --- a/quic/core/congestion_control/bbr2_startup.cc +++ b/quic/core/congestion_control/bbr2_startup.cc
@@ -93,8 +93,6 @@ return; } - const int64_t loss_events_in_round = model_->loss_events_in_round(); - // 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". @@ -102,19 +100,13 @@ return; } - QUIC_DVLOG(3) - << sender_ - << " CheckExcessiveLosses at end of round. loss_events_in_round:" - << loss_events_in_round - << ", threshold:" << Params().startup_full_loss_count << " @ " - << congestion_event.event_time; - // At the end of a round trip. Check if loss is too high in this round. - if (loss_events_in_round >= Params().startup_full_loss_count && - model_->IsInflightTooHigh(congestion_event)) { + if (model_->IsInflightTooHigh(congestion_event, + Params().startup_full_loss_count)) { const QuicByteCount bdp = model_->BDP(model_->MaxBandwidth()); QUIC_DVLOG(3) << sender_ << " Exiting STARTUP due to loss. inflight_hi:" << bdp; + // TODO(ianswett): Add a shared method to set inflight_hi in the model. model_->set_inflight_hi(bdp); full_bandwidth_reached_ = true;