In quic, add num_draining_outgoing_streams_ to quicsession, and this counter will be used to determine shouldkeepconnectionalive in quicspdyclientsessionbase. client side only. not protected. PiperOrigin-RevId: 314396250 Change-Id: I4873bdcdac03fd2d07d4caf5f7ce9d702e3b045f
diff --git a/quic/core/http/quic_spdy_client_session_base.cc b/quic/core/http/quic_spdy_client_session_base.cc index 21ecfee..04f8594 100644 --- a/quic/core/http/quic_spdy_client_session_base.cc +++ b/quic/core/http/quic_spdy_client_session_base.cc
@@ -228,6 +228,11 @@ return !HasActiveRequestStreams() && promised_by_id_.empty(); } +bool QuicSpdyClientSessionBase::ShouldKeepConnectionAlive() const { + return QuicSpdySession::ShouldKeepConnectionAlive() || + num_outgoing_draining_streams() > 0; +} + void QuicSpdyClientSessionBase::OnSettingsFrame(const SettingsFrame& frame) { QuicSpdySession::OnSettingsFrame(frame); std::unique_ptr<char[]> buffer;
diff --git a/quic/core/http/quic_spdy_client_session_base.h b/quic/core/http/quic_spdy_client_session_base.h index a3c9aac..20f4087 100644 --- a/quic/core/http/quic_spdy_client_session_base.h +++ b/quic/core/http/quic_spdy_client_session_base.h
@@ -110,6 +110,9 @@ // Returns true if there are no active requests and no promised streams. bool ShouldReleaseHeadersStreamSequencerBuffer() override; + // Override to wait for all received responses to be consumed by application. + bool ShouldKeepConnectionAlive() const override; + size_t get_max_promises() const { return max_open_incoming_unidirectional_streams() * kMaxPromisedStreamsMultiplier;
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index cdb8b31..1eb69e9 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -74,6 +74,7 @@ config_.GetMaxUnidirectionalStreamsToSend() + num_expected_unidirectional_static_streams), num_draining_streams_(0), + num_outgoing_draining_streams_(0), num_static_streams_(0), flow_controller_( this, @@ -905,6 +906,10 @@ if (stream_was_draining) { QUIC_BUG_IF(num_draining_streams_ == 0); --num_draining_streams_; + if (!IsIncomingStream(stream_id)) { + QUIC_BUG_IF(num_outgoing_draining_streams_ == 0); + --num_outgoing_draining_streams_; + } // Stream Id manager has been informed with draining streams. return; } @@ -1664,6 +1669,7 @@ } ++num_draining_streams_; if (!IsIncomingStream(stream_id)) { + ++num_outgoing_draining_streams_; OnCanCreateNewOutgoingStream(unidirectional); } }
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index 32aad51..c9e3216 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -594,6 +594,10 @@ size_t num_static_streams() const { return num_static_streams_; } + size_t num_outgoing_draining_streams() const { + return num_outgoing_draining_streams_; + } + // Processes the stream type information of |pending| depending on // different kinds of sessions' own rules. Returns true if the pending stream // is converted into a normal stream. @@ -738,6 +742,10 @@ // application to consume data. size_t num_draining_streams_; + // A counter for self initiated streams which have sent and received FIN but + // waiting for application to consume data. + size_t num_outgoing_draining_streams_; + // A counter for static streams which are in stream_map_. size_t num_static_streams_;