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 {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index 2d104a9..db8c55f 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -349,7 +349,8 @@ // a stream is reset because of an error). void OnStreamDoneWaitingForAcks(QuicStreamId id); - // Called when stream |id| is newly waiting for acks. + // TODO(b/136274541): Remove this once quic_remove_streams_waiting_for_acks is + // deprecated. Called when stream |id| is newly waiting for acks. void OnStreamWaitingForAcks(QuicStreamId id); // Returns true if there is pending handshake data in the crypto stream. @@ -755,7 +756,9 @@ // which are waiting for the first byte of payload to arrive. PendingStreamMap pending_stream_map_; - // Set of stream ids that are waiting for acks excluding crypto stream id. + // TODO(b/136274541): Remove this once quic_remove_streams_waiting_for_acks is + // deprecated. Set of stream ids that are waiting for acks excluding crypto + // stream id. QuicHashSet<QuicStreamId> streams_waiting_for_acks_; // TODO(fayang): Consider moving LegacyQuicStreamIdManager into @@ -831,6 +834,9 @@ // Latched value of flag quic_fix_gquic_stream_type. const bool fix_gquic_stream_type_; + + // Latched value of flag quic_remove_streams_waiting_for_acks. + const bool remove_streams_waiting_for_acks_; }; } // namespace quic
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h index 41484a3..2a7d036 100644 --- a/quic/core/quic_stream.h +++ b/quic/core/quic_stream.h
@@ -218,9 +218,6 @@ size_t busy_counter() const { return busy_counter_; } void set_busy_counter(size_t busy_counter) { busy_counter_ = busy_counter; } - void set_rst_received(bool rst_received) { rst_received_ = rst_received; } - void set_stream_error(QuicRstStreamErrorCode error) { stream_error_ = error; } - // Adjust the flow control window according to new offset in |frame|. virtual void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame); @@ -408,6 +405,9 @@ // empty. void SetFinSent(); + void set_rst_received(bool rst_received) { rst_received_ = rst_received; } + void set_stream_error(QuicRstStreamErrorCode error) { stream_error_ = error; } + StreamDelegateInterface* stream_delegate() { return stream_delegate_; } bool fin_buffered() const { return fin_buffered_; }