Move Crypto stream out of static stream map. It now lives as a class member of the sessions and can be accessed by GetMutableCryptoStream() gfe-relnote: protected by feature flag gfe2_reloadable_flag_quic_eliminate_static_stream_map. PiperOrigin-RevId: 244953118 Change-Id: Id92ddbc7c251090708edcdd3167b55ad1d12dc9b
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index d7a5473..796edaf 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -360,7 +360,7 @@ QuicUtils::GetHeadersStreamId(connection()->transport_version()), headers_stream_.get()); } else { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 7, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 7, 15); unowned_headers_stream_ = headers_stream_.get(); RegisterStaticStreamNew(std::move(headers_stream_)); } @@ -446,7 +446,7 @@ } if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 8, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 8, 15); connection()->CloseConnection( QUIC_INVALID_HEADERS_STREAM_DATA, "stream is static", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -715,7 +715,7 @@ // In the case where session is destructed by calling // dynamic_streams().clear(), we will have incorrect accounting here. // TODO(renjietang): Modify destructors and make this a DCHECK. - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 9, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 9, 15); if (static_cast<size_t>(dynamic_streams().size()) > num_incoming_static_streams() + num_outgoing_static_streams()) { return dynamic_streams().size() - num_incoming_static_streams() -
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index d780961..86ee78f 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -96,9 +96,19 @@ DCHECK_EQ(QuicUtils::GetCryptoStreamId(connection_->transport_version()), GetMutableCryptoStream()->id()); - RegisterStaticStream( - QuicUtils::GetCryptoStreamId(connection_->transport_version()), - GetMutableCryptoStream()); + if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + RegisterStaticStream( + QuicUtils::GetCryptoStreamId(connection_->transport_version()), + GetMutableCryptoStream()); + } else { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 10, 15); + QuicStreamId id = + QuicUtils::GetCryptoStreamId(connection_->transport_version()); + largest_static_stream_id_ = std::max(id, largest_static_stream_id_); + if (connection_->transport_version() == QUIC_VERSION_99) { + v99_streamid_manager_.RegisterStaticStream(id); + } + } } QuicSession::~QuicSession() { @@ -170,7 +180,7 @@ } if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && frame.fin && handler.stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 1, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 1, 15); connection()->CloseConnection( QUIC_INVALID_STREAM_ID, "Attempt to close a static stream", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -207,7 +217,9 @@ // TODO(fkastenholz): IETF Quic does not have static streams and does not // make exceptions for them with respect to processing things like // STOP_SENDING. - if (QuicContainsKey(static_stream_map_, stream_id)) { + if (QuicContainsKey(static_stream_map_, stream_id) || + stream_id == + QuicUtils::GetCryptoStreamId(connection_->transport_version())) { QUIC_DVLOG(1) << ENDPOINT << "Received STOP_SENDING for a static stream, id: " << stream_id << " Closing connection"; @@ -257,7 +269,7 @@ if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 2, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 2, 15); QUIC_DVLOG(1) << ENDPOINT << "Received STOP_SENDING for a static stream, id: " << stream_id << " Closing connection"; @@ -316,7 +328,7 @@ } if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && handler.stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 3, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 3, 15); connection()->CloseConnection( QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -375,7 +387,7 @@ } } } else { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 4, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 4, 15); // Copy all non static streams in a new map for the ease of deleting. QuicSmallMap<QuicStreamId, QuicStream*, 10> non_static_streams; for (const auto& it : dynamic_stream_map_) { @@ -694,7 +706,7 @@ if (it != dynamic_stream_map_.end()) { if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && it->second->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 5, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 5, 15); QUIC_DVLOG(1) << ENDPOINT << "Try to send rst for a static stream, id: " << id << " Closing connection"; @@ -770,7 +782,7 @@ QuicStream* stream = it->second.get(); if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 6, 9); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 6, 15); QUIC_DVLOG(1) << ENDPOINT << "Try to close a static stream, id: " << stream_id << " Closing connection"; @@ -1004,6 +1016,11 @@ for (auto const& kv : dynamic_stream_map_) { kv.second->flow_controller()->UpdateReceiveWindowSize(stream_window); } + if (GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 11, 15); + GetMutableCryptoStream()->flow_controller()->UpdateReceiveWindowSize( + stream_window); + } } void QuicSession::HandleFrameOnNonexistentOutgoingStream( @@ -1048,6 +1065,10 @@ for (auto const& kv : dynamic_stream_map_) { kv.second->UpdateSendWindowOffset(new_window); } + if (GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 12, 15); + GetMutableCryptoStream()->UpdateSendWindowOffset(new_window); + } } void QuicSession::OnNewSessionFlowControlWindow(QuicStreamOffset new_window) { @@ -1175,6 +1196,12 @@ QuicSession::StreamHandler QuicSession::GetOrCreateStreamImpl( QuicStreamId stream_id, bool may_buffer) { + if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + stream_id == + QuicUtils::GetCryptoStreamId(connection_->transport_version())) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 13, 15); + return StreamHandler(GetMutableCryptoStream()); + } StaticStreamMap::iterator it = static_stream_map_.find(stream_id); if (it != static_stream_map_.end()) { return StreamHandler(it->second); @@ -1323,7 +1350,8 @@ id); if (QuicContainsKey(static_stream_map_, id) || QuicContainsKey(dynamic_stream_map_, id) || - QuicContainsKey(pending_stream_map_, id)) { + QuicContainsKey(pending_stream_map_, id) || + id == QuicUtils::GetCryptoStreamId(connection_->transport_version())) { // Stream is active return true; } @@ -1415,6 +1443,11 @@ return true; } } + if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + GetMutableCryptoStream()->flow_controller()->IsBlocked()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 14, 15); + return true; + } return false; } @@ -1470,6 +1503,13 @@ if (zombie_stream != zombie_streams_.end()) { return zombie_stream->second.get(); } + + if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + id == QuicUtils::GetCryptoStreamId(connection_->transport_version())) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 15, 15); + return const_cast<QuicCryptoStream*>(GetCryptoStream()); + } + return nullptr; }