Use a QuicSession member to latch gfe2_reloadable_flag_quic_eliminate_static_stream_map_2. This prevents unexpected behavior from runtime flag flipping. gfe-relnote: gfe2_reloadable_flag_quic_eliminate_static_stream_map_2 replaces gfe2_reloadable_flag_quic_eliminate_static_stream_map for rollout purposes. PiperOrigin-RevId: 246926123 Change-Id: I11103af393e7fa93ea5b2d3cd90f9fe423fbed96
diff --git a/quic/core/http/quic_spdy_client_session_base.cc b/quic/core/http/quic_spdy_client_session_base.cc index 4aa3348..2db5b84 100644 --- a/quic/core/http/quic_spdy_client_session_base.cc +++ b/quic/core/http/quic_spdy_client_session_base.cc
@@ -95,8 +95,7 @@ // It's quite possible to receive headers after a stream has been reset. return; } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && - stream->is_static()) { + if (eliminate_static_stream_map() && stream->is_static()) { connection()->CloseConnection( QUIC_INVALID_HEADERS_STREAM_DATA, "stream is static", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc index cc1eee7..de34250 100644 --- a/quic/core/http/quic_spdy_session.cc +++ b/quic/core/http/quic_spdy_session.cc
@@ -355,12 +355,12 @@ headers_stream_ = QuicMakeUnique<QuicHeadersStream>((this)); DCHECK_EQ(QuicUtils::GetHeadersStreamId(connection()->transport_version()), headers_stream_->id()); - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!eliminate_static_stream_map()) { RegisterStaticStream( QuicUtils::GetHeadersStreamId(connection()->transport_version()), headers_stream_.get()); } else { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 7, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 7, 17); unowned_headers_stream_ = headers_stream_.get(); RegisterStaticStreamNew(std::move(headers_stream_)); } @@ -444,9 +444,8 @@ // It's quite possible to receive headers after a stream has been reset. return; } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && - stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 8, 15); + if (eliminate_static_stream_map() && stream->is_static()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 8, 17); connection()->CloseConnection( QUIC_INVALID_HEADERS_STREAM_DATA, "stream is static", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -709,13 +708,13 @@ } bool QuicSpdySession::HasActiveRequestStreams() const { - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!eliminate_static_stream_map()) { return !dynamic_streams().empty(); } // 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, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 9, 17); 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/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h index 9248fa5..23e57c3 100644 --- a/quic/core/http/quic_spdy_session.h +++ b/quic/core/http/quic_spdy_session.h
@@ -140,15 +140,13 @@ QpackEncoder* qpack_encoder(); QpackDecoder* qpack_decoder(); QuicHeadersStream* headers_stream() { - return GetQuicReloadableFlag(quic_eliminate_static_stream_map) - ? unowned_headers_stream_ - : headers_stream_.get(); + return eliminate_static_stream_map() ? unowned_headers_stream_ + : headers_stream_.get(); } const QuicHeadersStream* headers_stream() const { - return GetQuicReloadableFlag(quic_eliminate_static_stream_map) - ? unowned_headers_stream_ - : headers_stream_.get(); + return eliminate_static_stream_map() ? unowned_headers_stream_ + : headers_stream_.get(); } bool server_push_enabled() const { return server_push_enabled_; }
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc index 83ea72f..6724e69 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -923,7 +923,7 @@ TestCryptoStream* crypto_stream = session_.GetMutableCryptoStream(); EXPECT_CALL(*crypto_stream, OnCanWrite()); TestHeadersStream* headers_stream; - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) { QuicSpdySessionPeer::SetHeadersStream(&session_, nullptr); headers_stream = new TestHeadersStream(&session_); QuicSpdySessionPeer::SetHeadersStream(&session_, headers_stream); @@ -1643,7 +1643,7 @@ TEST_P(QuicSpdySessionTestClient, WritePriority) { TestHeadersStream* headers_stream; - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) { QuicSpdySessionPeer::SetHeadersStream(&session_, nullptr); headers_stream = new TestHeadersStream(&session_); QuicSpdySessionPeer::SetHeadersStream(&session_, headers_stream);
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index 5d02a12..2505f7e 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -84,7 +84,9 @@ control_frame_manager_(this), last_message_id_(0), closed_streams_clean_up_alarm_(nullptr), - supported_versions_(supported_versions) { + supported_versions_(supported_versions), + eliminate_static_stream_map_( + GetQuicReloadableFlag(quic_eliminate_static_stream_map_2)) { closed_streams_clean_up_alarm_ = QuicWrapUnique<QuicAlarm>(connection_->alarm_factory()->CreateAlarm( new ClosedStreamsCleanUpDelegate(this))); @@ -98,12 +100,12 @@ DCHECK_EQ(QuicUtils::GetCryptoStreamId(connection_->transport_version()), GetMutableCryptoStream()->id()); - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!eliminate_static_stream_map_) { RegisterStaticStream( QuicUtils::GetCryptoStreamId(connection_->transport_version()), GetMutableCryptoStream()); } else { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 10, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 10, 17); QuicStreamId id = QuicUtils::GetCryptoStreamId(connection_->transport_version()); largest_static_stream_id_ = std::max(id, largest_static_stream_id_); @@ -133,7 +135,7 @@ } void QuicSession::RegisterStaticStreamNew(std::unique_ptr<QuicStream> stream) { - DCHECK(GetQuicReloadableFlag(quic_eliminate_static_stream_map)); + DCHECK(eliminate_static_stream_map_); QuicStreamId stream_id = stream->id(); dynamic_stream_map_[stream_id] = std::move(stream); if (connection_->transport_version() == QUIC_VERSION_99) { @@ -180,9 +182,9 @@ } return; } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && frame.fin && + if (eliminate_static_stream_map_ && frame.fin && handler.stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 1, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 1, 17); connection()->CloseConnection( QUIC_INVALID_STREAM_ID, "Attempt to close a static stream", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -269,9 +271,8 @@ return true; } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && - stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 2, 15); + if (eliminate_static_stream_map_ && stream->is_static()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 2, 17); QUIC_DVLOG(1) << ENDPOINT << "Received STOP_SENDING for a static stream, id: " << stream_id << " Closing connection"; @@ -328,9 +329,8 @@ HandleRstOnValidNonexistentStream(frame); return; // Errors are handled by GetOrCreateStream. } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && - handler.stream->is_static()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 3, 15); + if (eliminate_static_stream_map_ && handler.stream->is_static()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 3, 17); connection()->CloseConnection( QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream", ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); @@ -376,7 +376,7 @@ error_ = error; } - if (!GetQuicReloadableFlag(quic_eliminate_static_stream_map)) { + if (!eliminate_static_stream_map_) { while (!dynamic_stream_map_.empty()) { DynamicStreamMap::iterator it = dynamic_stream_map_.begin(); QuicStreamId id = it->first; @@ -389,7 +389,7 @@ } } } else { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 4, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 4, 17); // 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_) { @@ -714,9 +714,8 @@ DynamicStreamMap::iterator it = dynamic_stream_map_.find(id); 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, 15); + if (eliminate_static_stream_map_ && it->second->is_static()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 5, 17); QUIC_DVLOG(1) << ENDPOINT << "Try to send rst for a static stream, id: " << id << " Closing connection"; @@ -790,9 +789,8 @@ return; } 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, 15); + if (eliminate_static_stream_map_ && stream->is_static()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 6, 17); QUIC_DVLOG(1) << ENDPOINT << "Try to close a static stream, id: " << stream_id << " Closing connection"; @@ -1026,8 +1024,8 @@ 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); + if (eliminate_static_stream_map_) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 11, 17); GetMutableCryptoStream()->flow_controller()->UpdateReceiveWindowSize( stream_window); } @@ -1076,8 +1074,8 @@ 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); + if (eliminate_static_stream_map_) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 12, 17); GetMutableCryptoStream()->UpdateSendWindowOffset(new_window); } } @@ -1208,10 +1206,10 @@ QuicSession::StreamHandler QuicSession::GetOrCreateStreamImpl( QuicStreamId stream_id, bool may_buffer) { - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + if (eliminate_static_stream_map_ && stream_id == QuicUtils::GetCryptoStreamId(connection_->transport_version())) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 13, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 13, 17); return StreamHandler(GetMutableCryptoStream()); } StaticStreamMap::iterator it = static_stream_map_.find(stream_id); @@ -1455,9 +1453,9 @@ return true; } } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + if (eliminate_static_stream_map_ && GetMutableCryptoStream()->flow_controller()->IsBlocked()) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 14, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 14, 17); return true; } return false; @@ -1516,9 +1514,9 @@ return zombie_stream->second.get(); } - if (GetQuicReloadableFlag(quic_eliminate_static_stream_map) && + if (eliminate_static_stream_map_ && id == QuicUtils::GetCryptoStreamId(connection_->transport_version())) { - QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map, 15, 15); + QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_2, 15, 17); return const_cast<QuicCryptoStream*>(GetCryptoStream()); }
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index b24e5b6..172c52c 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -575,6 +575,10 @@ StreamHandler GetOrCreateStreamImpl(QuicStreamId stream_id, bool may_buffer); + const bool eliminate_static_stream_map() const { + return eliminate_static_stream_map_; + } + private: friend class test::QuicSessionPeer; @@ -717,6 +721,9 @@ // Supported version list used by the crypto handshake only. Please note, this // list may be a superset of the connection framer's supported versions. ParsedQuicVersionVector supported_versions_; + + // Latched value of quic_eliminate_static_stream_map. + const bool eliminate_static_stream_map_; }; } // namespace quic