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