Remove streams_waiting_for_acks_ in QuicSession because it stores duplicate information and only reduces minimal time complexity.

Session shouldn't care this much about streams' states.

Protected by gfe2_reloadable_flag_quic_remove_streams_waiting_for_acks

PiperOrigin-RevId: 321829178
Change-Id: I3589810eb553b1b743799b7ab51990fbd42e1008
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 5bfc517..a6286cc 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -99,8 +99,9 @@
       is_configured_(false),
       enable_round_robin_scheduling_(false),
       was_zero_rtt_rejected_(false),
-      fix_gquic_stream_type_(
-          GetQuicReloadableFlag(quic_fix_gquic_stream_type)) {
+      fix_gquic_stream_type_(GetQuicReloadableFlag(quic_fix_gquic_stream_type)),
+      remove_streams_waiting_for_acks_(
+          GetQuicReloadableFlag(quic_remove_streams_waiting_for_acks)) {
   closed_streams_clean_up_alarm_ =
       QuicWrapUnique<QuicAlarm>(connection_->alarm_factory()->CreateAlarm(
           new ClosedStreamsCleanUpDelegate(this)));
@@ -877,7 +878,11 @@
     zombie_streams_[stream_id] = std::move(it->second);
   } else {
     // Clean up the stream since it is no longer waiting for acks.
-    streams_waiting_for_acks_.erase(stream_id);
+    if (remove_streams_waiting_for_acks_) {
+      QUIC_RELOADABLE_FLAG_COUNT_N(quic_remove_streams_waiting_for_acks, 1, 4);
+    } else {
+      streams_waiting_for_acks_.erase(stream_id);
+    }
     closed_streams_.push_back(std::move(it->second));
     // Do not retransmit data of a closed stream.
     streams_with_pending_retransmission_.erase(stream_id);
@@ -2003,7 +2008,11 @@
 }
 
 void QuicSession::OnStreamDoneWaitingForAcks(QuicStreamId id) {
-  streams_waiting_for_acks_.erase(id);
+  if (remove_streams_waiting_for_acks_) {
+    QUIC_RELOADABLE_FLAG_COUNT_N(quic_remove_streams_waiting_for_acks, 2, 4);
+  } else {
+    streams_waiting_for_acks_.erase(id);
+  }
 
   auto it = zombie_streams_.find(id);
   if (it == zombie_streams_.end()) {
@@ -2020,6 +2029,10 @@
 }
 
 void QuicSession::OnStreamWaitingForAcks(QuicStreamId id) {
+  if (remove_streams_waiting_for_acks_) {
+    QUIC_RELOADABLE_FLAG_COUNT_N(quic_remove_streams_waiting_for_acks, 3, 4);
+    return;
+  }
   // Exclude crypto stream's status since it is counted in HasUnackedCryptoData.
   if (GetCryptoStream() != nullptr && id == GetCryptoStream()->id()) {
     return;
@@ -2181,7 +2194,19 @@
 }
 
 bool QuicSession::HasUnackedStreamData() const {
-  return !streams_waiting_for_acks_.empty();
+  if (!remove_streams_waiting_for_acks_) {
+    return !streams_waiting_for_acks_.empty();
+  }
+  QUIC_RELOADABLE_FLAG_COUNT_N(quic_remove_streams_waiting_for_acks, 4, 4);
+  if (!zombie_streams().empty()) {
+    return true;
+  }
+  for (const auto& it : stream_map_) {
+    if (it.second->IsWaitingForAcks()) {
+      return true;
+    }
+  }
+  return false;
 }
 
 HandshakeState QuicSession::GetHandshakeState() const {