Make QuicSession::OnStreamClosed() more robust. Since we don't have the stream close loop anymore, closing stream twice is not expected. No behavior change. not protected. PiperOrigin-RevId: 320273993 Change-Id: I90c9162b41ef972eea5731eb74fe524d8f25fd5e
diff --git a/quic/core/http/quic_spdy_client_stream_test.cc b/quic/core/http/quic_spdy_client_stream_test.cc index 1aba000..ffd4590 100644 --- a/quic/core/http/quic_spdy_client_stream_test.cc +++ b/quic/core/http/quic_spdy_client_stream_test.cc
@@ -48,6 +48,8 @@ MOCK_METHOD(void, CloseStream, (QuicStreamId stream_id), (override)); + using QuicSession::ActivateStream; + private: QuicCryptoClientConfig crypto_config_; }; @@ -67,14 +69,18 @@ &push_promise_index_), body_("hello world") { session_.Initialize(); + connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1)); headers_[":status"] = "200"; headers_["content-length"] = "11"; - stream_ = std::make_unique<QuicSpdyClientStream>( + auto stream = std::make_unique<QuicSpdyClientStream>( GetNthClientInitiatedBidirectionalStreamId( connection_->transport_version(), 0), &session_, BIDIRECTIONAL); + stream_ = stream.get(); + session_.ActivateStream(std::move(stream)); + stream_visitor_ = std::make_unique<StreamVisitor>(); stream_->set_visitor(stream_visitor_.get()); } @@ -91,7 +97,7 @@ QuicClientPushPromiseIndex push_promise_index_; MockQuicSpdyClientSession session_; - std::unique_ptr<QuicSpdyClientStream> stream_; + QuicSpdyClientStream* stream_; std::unique_ptr<StreamVisitor> stream_visitor_; SpdyHeaderBlock headers_; std::string body_;
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc index fea8541..df83890 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -161,6 +161,9 @@ MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override)); + void OnConnectionClosed(QuicErrorCode /*error*/, + ConnectionCloseSource /*source*/) override {} + private: using QuicCryptoStream::session;
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index d83823b..e09decf 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -867,17 +867,17 @@ QUIC_DVLOG(1) << ENDPOINT << "Closing stream: " << stream_id; StreamMap::iterator it = stream_map_.find(stream_id); if (it == stream_map_.end()) { - QUIC_DVLOG(1) << ENDPOINT << "Stream is already closed: " << stream_id; + QUIC_BUG << ENDPOINT << "Stream is already closed: " << stream_id; return; } QuicStream* stream = it->second.get(); StreamType type = stream->type(); if (stream->IsWaitingForAcks()) { - zombie_streams_[stream->id()] = std::move(it->second); + 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()); + 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);
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc index 8459269..54c7bfb 100644 --- a/quic/core/quic_session_test.cc +++ b/quic/core/quic_session_test.cc
@@ -144,6 +144,9 @@ MOCK_METHOD(bool, HasPendingRetransmission, (), (const, override)); + void OnConnectionClosed(QuicErrorCode /*error*/, + ConnectionCloseSource /*source*/) override {} + private: using QuicCryptoStream::session;