gfe-relnote: (n/a) Record number of spurious losses in QuicConnectionStats. Stats only, not protected.

This is needed to calculate the spurious loss ratio from the loss algorithm.

PiperOrigin-RevId: 297897128
Change-Id: I44ca14e9946c586959b2afdd61960f35da5aae3e
diff --git a/quic/core/quic_connection_stats.h b/quic/core/quic_connection_stats.h
index 9f4deca..0edb7ba 100644
--- a/quic/core/quic_connection_stats.h
+++ b/quic/core/quic_connection_stats.h
@@ -45,6 +45,8 @@
   QuicPacketCount packets_spuriously_retransmitted = 0;
   // Number of packets abandoned as lost by the loss detection algorithm.
   QuicPacketCount packets_lost = 0;
+  QuicPacketCount packet_spuriously_detected_lost = 0;
+
   // The sum of the detection time of all lost packets. The detection time of a
   // lost packet is defined as: T(detection) - T(send).
   QuicTime::Delta total_loss_detection_time = QuicTime::Delta::Zero();
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index d92883b..fc7287f 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -622,6 +622,7 @@
     loss_algorithm_->SpuriousLossDetected(unacked_packets_, rtt_stats_,
                                           ack_receive_time, packet_number,
                                           previous_largest_acked);
+    ++stats_->packet_spuriously_detected_lost;
   }
 
   if (network_change_visitor_ != nullptr &&
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc
index 99ddfcd..35feefc 100644
--- a/quic/core/quic_sent_packet_manager_test.cc
+++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -671,9 +671,11 @@
                              clock_.Now());
     manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
     manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
+    EXPECT_EQ(0u, stats_.packet_spuriously_detected_lost);
     EXPECT_EQ(PACKETS_NEWLY_ACKED,
               manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
                                      ENCRYPTION_INITIAL));
+    EXPECT_EQ(1u, stats_.packet_spuriously_detected_lost);
     // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
     // 5 will cause 5 be considered as a spurious retransmission as no new
     // data gets acked.