Improve logging for BandwidthSampler map size bug entry.

gfe-relnote: extra details in a GFE_BUG call.  Not flag-protected.
PiperOrigin-RevId: 263353963
Change-Id: Ie039f8d91fea6b79796975e975b9cc9d6c0a9c73
diff --git a/quic/core/congestion_control/bandwidth_sampler.cc b/quic/core/congestion_control/bandwidth_sampler.cc
index 39c7051..37f678d 100644
--- a/quic/core/congestion_control/bandwidth_sampler.cc
+++ b/quic/core/congestion_control/bandwidth_sampler.cc
@@ -41,6 +41,7 @@
 }
 
 BandwidthSampler::BandwidthSampler(
+    const QuicUnackedPacketMap* unacked_packet_map,
     QuicRoundTripCount max_height_tracker_window_length)
     : total_bytes_sent_(0),
       total_bytes_acked_(0),
@@ -51,6 +52,7 @@
       is_app_limited_(false),
       connection_state_map_(),
       max_tracked_packets_(GetQuicFlag(FLAGS_quic_max_tracked_packet_count)),
+      unacked_packet_map_(unacked_packet_map),
       max_ack_height_tracker_(max_height_tracker_window_length),
       total_bytes_acked_after_last_ack_event_(0) {}
 
@@ -88,9 +90,18 @@
   if (!connection_state_map_.IsEmpty() &&
       packet_number >
           connection_state_map_.last_packet() + max_tracked_packets_) {
-    QUIC_BUG << "BandwidthSampler in-flight packet map has exceeded maximum "
-                "number "
-                "of tracked packets.";
+    if (unacked_packet_map_ != nullptr) {
+      QUIC_BUG << "BandwidthSampler in-flight packet map has exceeded maximum "
+                  "number of tracked packets.  First tracked: "
+               << connection_state_map_.first_packet()
+               << "; last tracked: " << connection_state_map_.last_packet()
+               << "; least unacked: " << unacked_packet_map_->GetLeastUnacked()
+               << "; largest observed: "
+               << unacked_packet_map_->largest_acked();
+    } else {
+      QUIC_BUG << "BandwidthSampler in-flight packet map has exceeded maximum "
+                  "number of tracked packets.";
+    }
   }
 
   bool success =
diff --git a/quic/core/congestion_control/bandwidth_sampler.h b/quic/core/congestion_control/bandwidth_sampler.h
index 6af16b7..93ec351 100644
--- a/quic/core/congestion_control/bandwidth_sampler.h
+++ b/quic/core/congestion_control/bandwidth_sampler.h
@@ -12,6 +12,7 @@
 #include "net/third_party/quiche/src/quic/core/quic_packets.h"
 #include "net/third_party/quiche/src/quic/core/quic_time.h"
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
+#include "net/third_party/quiche/src/quic/core/quic_unacked_packet_map.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -241,8 +242,8 @@
 // connection is app-limited, the approach works in other cases too.
 class QUIC_EXPORT_PRIVATE BandwidthSampler : public BandwidthSamplerInterface {
  public:
-  explicit BandwidthSampler(
-      QuicRoundTripCount max_height_tracker_window_length);
+  BandwidthSampler(const QuicUnackedPacketMap* unacked_packet_map,
+                   QuicRoundTripCount max_height_tracker_window_length);
   ~BandwidthSampler() override;
 
   void OnPacketSent(QuicTime sent_time,
@@ -378,6 +379,11 @@
   // Maximum number of tracked packets.
   const QuicPacketCount max_tracked_packets_;
 
+  // The main unacked packet map.  Used for outputting extra debugging details.
+  // May be null.
+  // TODO(vasilvv): remove this once it's no longer useful for debugging.
+  const QuicUnackedPacketMap* unacked_packet_map_;
+
   // Handles the actual bandwidth calculations, whereas the outer method handles
   // retrieving and removing |sent_packet|.
   BandwidthSample OnPacketAcknowledgedInner(
diff --git a/quic/core/congestion_control/bandwidth_sampler_test.cc b/quic/core/congestion_control/bandwidth_sampler_test.cc
index 9e36bdc..aeff976 100644
--- a/quic/core/congestion_control/bandwidth_sampler_test.cc
+++ b/quic/core/congestion_control/bandwidth_sampler_test.cc
@@ -33,7 +33,8 @@
 class BandwidthSamplerTest : public QuicTest {
  protected:
   BandwidthSamplerTest()
-      : sampler_(/*max_height_tracker_window_length=*/0), bytes_in_flight_(0) {
+      : sampler_(nullptr, /*max_height_tracker_window_length=*/0),
+        bytes_in_flight_(0) {
     // Ensure that the clock does not start at zero.
     clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
   }
diff --git a/quic/core/congestion_control/bbr2_misc.cc b/quic/core/congestion_control/bbr2_misc.cc
index e2fc8f0..a527417 100644
--- a/quic/core/congestion_control/bbr2_misc.cc
+++ b/quic/core/congestion_control/bbr2_misc.cc
@@ -83,7 +83,7 @@
                                    float cwnd_gain,
                                    float pacing_gain)
     : params_(params),
-      bandwidth_sampler_(params->initial_max_ack_height_filter_window),
+      bandwidth_sampler_(nullptr, params->initial_max_ack_height_filter_window),
       min_rtt_filter_(initial_rtt, initial_rtt_timestamp),
       cwnd_gain_(cwnd_gain),
       pacing_gain_(pacing_gain) {}
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index bea0d00..efae7c5 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -90,7 +90,7 @@
       random_(random),
       stats_(stats),
       mode_(STARTUP),
-      sampler_(kBandwidthWindowSize),
+      sampler_(unacked_packets, kBandwidthWindowSize),
       round_trip_count_(0),
       max_bandwidth_(kBandwidthWindowSize, QuicBandwidth::Zero(), 0),
       max_ack_height_(kBandwidthWindowSize, 0, 0),