Fix incorrect determination of stream type in QUIC T050. Protected by gfe2_reloadable_flag_quic_fix_gquic_stream_type PiperOrigin-RevId: 317208417 Change-Id: I9f139a5d5a3859b7642a6e7f45ea7ef1dcbd3368
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc index c466a9f..6408667 100644 --- a/quic/core/http/quic_spdy_client_session_test.cc +++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -1179,13 +1179,15 @@ return; } + SetQuicReloadableFlag(quic_fix_gquic_stream_type, true); + CompleteFirstConnection(); // Create a second connection, but disable 0-RTT on the server. CreateConnection(); QuicConfig config = DefaultQuicConfig(); // Server doesn't allow any outgoing streams. - config.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(1); + config.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(2); config.SetInitialMaxStreamDataBytesUnidirectionalToSend(1); SSL_CTX_set_early_data_enabled(server_crypto_config_->ssl_ctx(), false); session_->CryptoConnect(); @@ -1207,7 +1209,7 @@ CloseConnection( QUIC_ZERO_RTT_UNRETRANSMITTABLE, "Server rejected 0-RTT, aborting because new stream max " - "data 1 for stream 3 is less than currently used: 5", + "data 2 for stream 3 is less than currently used: 5", _)) .Times(1) .WillOnce(testing::Invoke(connection_,
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index ad7fce3..fec3fe5 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -98,7 +98,9 @@ use_http2_priority_write_scheduler_(false), is_configured_(false), enable_round_robin_scheduling_(false), - was_zero_rtt_rejected_(false) { + was_zero_rtt_rejected_(false), + fix_gquic_stream_type_( + GetQuicReloadableFlag(quic_fix_gquic_stream_type)) { closed_streams_clean_up_alarm_ = QuicWrapUnique<QuicAlarm>(connection_->alarm_factory()->CreateAlarm( new ClosedStreamsCleanUpDelegate(this))); @@ -1324,8 +1326,15 @@ // Inform all existing outgoing unidirectional streams about the new window. for (auto const& kv : stream_map_) { const QuicStreamId id = kv.first; - if (QuicUtils::IsBidirectionalStreamId(id)) { - continue; + if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 1, 3); + if (kv.second->type() == BIDIRECTIONAL) { + continue; + } + } else { + if (QuicUtils::IsBidirectionalStreamId(id)) { + continue; + } } if (!QuicUtils::IsOutgoingStreamId(connection_->version(), id, perspective())) { @@ -1351,8 +1360,15 @@ // Inform all existing outgoing bidirectional streams about the new window. for (auto const& kv : stream_map_) { const QuicStreamId id = kv.first; - if (!QuicUtils::IsBidirectionalStreamId(id)) { - continue; + if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 2, 3); + if (kv.second->type() != BIDIRECTIONAL) { + continue; + } + } else { + if (!QuicUtils::IsBidirectionalStreamId(id)) { + continue; + } } if (!QuicUtils::IsOutgoingStreamId(connection_->version(), id, perspective())) { @@ -1378,8 +1394,15 @@ // Inform all existing incoming bidirectional streams about the new window. for (auto const& kv : stream_map_) { const QuicStreamId id = kv.first; - if (!QuicUtils::IsBidirectionalStreamId(id)) { - continue; + if (fix_gquic_stream_type_ && !version().HasIetfQuicFrames()) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_fix_gquic_stream_type, 3, 3); + if (kv.second->type() != BIDIRECTIONAL) { + continue; + } + } else { + if (!QuicUtils::IsBidirectionalStreamId(id)) { + continue; + } } if (QuicUtils::IsOutgoingStreamId(connection_->version(), id, perspective())) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index e5e794f..9233402 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -818,6 +818,9 @@ // Whether the session has received a 0-RTT rejection (QUIC+TLS only). bool was_zero_rtt_rejected_; + + // Latched value of flag quic_fix_gquic_stream_type. + const bool fix_gquic_stream_type_; }; } // namespace quic