In quic, stop blackhole detection if timer based loss detection removes all packets from in flight but no retransmission can be sent (e.g., write blocked, message frame, etc). protected by existing gfe2_reloadable_flag_quic_default_enable_5rto_blackhole_detection2. Also add QUIC_BUGs to make sure there are bytes in flight when arming blackhole detection and when the blackhole is detected. PiperOrigin-RevId: 315728450 Change-Id: I017bc77a95b88da460676de21cc40199d4b129c8
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 7b1b9af..18389f0 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -2695,6 +2695,11 @@ const bool in_flight = sent_packet_manager_.OnPacketSent( packet, packet_send_time, packet->transmission_type, IsRetransmittable(*packet)); + QUIC_BUG_IF(default_enable_5rto_blackhole_detection_ && + blackhole_detector_.IsDetectionInProgress() && + !sent_packet_manager_.HasInFlightPackets()) + << ENDPOINT + << "Trying to start blackhole detection without no bytes in flight"; if (in_flight || !retransmission_alarm_->IsSet()) { SetRetransmissionAlarm(); @@ -2985,6 +2990,13 @@ debug_visitor_->OnNPacketNumbersSkipped(num_packet_numbers_to_skip); } } + if (default_enable_5rto_blackhole_detection_ && + !sent_packet_manager_.HasInFlightPackets() && + blackhole_detector_.IsDetectionInProgress()) { + // Stop detection in quiescence. + DCHECK_EQ(QuicSentPacketManager::LOSS_MODE, retransmission_mode); + blackhole_detector_.StopDetection(); + } WriteIfNotBlocked(); // A write failure can result in the connection being closed, don't attempt to @@ -4361,6 +4373,11 @@ // Stop detections in quiecense. blackhole_detector_.StopDetection(); } + QUIC_BUG_IF(default_enable_5rto_blackhole_detection_ && + blackhole_detector_.IsDetectionInProgress() && + !sent_packet_manager_.HasInFlightPackets()) + << ENDPOINT + << "Trying to start blackhole detection without no bytes in flight"; } QuicPacketNumber QuicConnection::GetLargestReceivedPacketWithAck() const { @@ -4474,6 +4491,11 @@ } void QuicConnection::OnBlackholeDetected() { + QUIC_BUG_IF(default_enable_5rto_blackhole_detection_ && + !sent_packet_manager_.HasInFlightPackets()) + << ENDPOINT + << "Closing connection because of blackhole, but there is no bytes in " + "flight"; CloseConnection(QUIC_TOO_MANY_RTOS, "Network blackhole detected.", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); }