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;
}