gfe-relnote: In QUIC, rewrite part of QuicSession::OnStreamClosed to make it simpler. Refactoring only. No functional change expected. Protected by existing gfe2_reloadable_flag_quic_break_session_stream_close_loop. PiperOrigin-RevId: 307101589 Change-Id: Ifc90bfebf0006814788897729a8b621cd3c7d3e9
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index 3c6d323..e79ec24 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -1008,14 +1008,22 @@ } } - // If we haven't received a FIN or RST for this stream, we need to keep track - // of the how many bytes the stream's flow controller believes it has - // received, for accurate connection level flow control accounting. - const bool had_fin_or_rst = stream->HasReceivedFinalOffset(); - if (!had_fin_or_rst) { + if (!stream->HasReceivedFinalOffset()) { + // If we haven't received a FIN or RST for this stream, we need to keep + // track of the how many bytes the stream's flow controller believes it has + // received, for accurate connection level flow control accounting. + // If this is an outgoing stream, it is technically open from peer's + // perspective. Do not inform stream Id manager yet. + DCHECK(!stream->was_draining()); InsertLocallyClosedStreamsHighestOffset( stream_id, stream->flow_controller()->highest_received_byte_offset()); + stream_map_.erase(it); + if (IsIncomingStream(stream_id)) { + --num_dynamic_incoming_streams_; + } + return; } + bool stream_was_draining = false; if (deprecate_draining_streams_) { stream_was_draining = stream->was_draining(); @@ -1039,19 +1047,22 @@ --num_draining_outgoing_streams_; } draining_streams_.erase(stream_id); - } else if (VersionHasIetfQuicFrames(transport_version())) { - // Stream was not draining, but we did have a fin or rst, so we can now - // free the stream ID if version 99. - if (had_fin_or_rst && connection_->connected()) { - // Do not bother informing stream ID manager if connection is closed. + // Stream Id manager has been informed with draining streams. + return; + } + if (!connection_->connected()) { + // Do not bother informing stream ID manager if connection has been + // disconnected. + return; + } + if (IsIncomingStream(stream_id)) { + // Stream Id manager is only interested in peer initiated stream IDs. + if (VersionHasIetfQuicFrames(transport_version())) { v99_streamid_manager_.OnStreamClosed(stream_id); } + return; } - - if (!stream_was_draining && !IsIncomingStream(stream_id) && had_fin_or_rst && - !VersionHasIetfQuicFrames(transport_version())) { - // Streams that first became draining already called OnCanCreate... - // This covers the case where the stream went directly to being closed. + if (!VersionHasIetfQuicFrames(transport_version())) { OnCanCreateNewOutgoingStream(type != BIDIRECTIONAL); } }