In quic, stop sending duplicate max_streams. protected by gfe2_reloadable_flag_quic_stop_sending_duplicate_max_streams.
PiperOrigin-RevId: 315729190
Change-Id: Ic5ad61858823706e563e860cc6096970156de4bc
diff --git a/quic/core/quic_stream_id_manager.cc b/quic/core/quic_stream_id_manager.cc
index ba31dec..5cde890 100644
--- a/quic/core/quic_stream_id_manager.cc
+++ b/quic/core/quic_stream_id_manager.cc
@@ -55,6 +55,14 @@
" exceeds incoming max stream ", incoming_advertised_max_streams_);
return false;
}
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_stop_sending_duplicate_max_streams);
+ DCHECK_LE(incoming_advertised_max_streams_, incoming_actual_max_streams_);
+ if (incoming_advertised_max_streams_ == incoming_actual_max_streams_) {
+ // We have told peer about current max.
+ return true;
+ }
+ }
if (frame.stream_count < incoming_actual_max_streams_) {
// Peer thinks it's blocked on a stream count that is less than our current
// max. Inform the peer of the correct stream count.
@@ -104,6 +112,10 @@
}
void QuicStreamIdManager::SendMaxStreamsFrame() {
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ QUIC_BUG_IF(incoming_advertised_max_streams_ >=
+ incoming_actual_max_streams_);
+ }
incoming_advertised_max_streams_ = incoming_actual_max_streams_;
delegate_->SendMaxStreams(incoming_advertised_max_streams_, unidirectional_);
}
diff --git a/quic/core/quic_stream_id_manager_test.cc b/quic/core/quic_stream_id_manager_test.cc
index 2179ba2..689d411 100644
--- a/quic/core/quic_stream_id_manager_test.cc
+++ b/quic/core/quic_stream_id_manager_test.cc
@@ -139,13 +139,18 @@
}
// Check the case of the stream count in a STREAMS_BLOCKED frame is less than
-// the count most recently advertised in a MAX_STREAMS frame. This should cause
-// a MAX_STREAMS frame with the most recently advertised count to be sent.
+// the count most recently advertised in a MAX_STREAMS frame.
TEST_P(QuicStreamIdManagerTest, ProcessStreamsBlockedOk) {
QuicStreamCount stream_count =
stream_id_manager_.incoming_initial_max_open_streams();
QuicStreamsBlockedFrame frame(0, stream_count - 1, IsUnidirectional());
- EXPECT_CALL(delegate_, SendMaxStreams(stream_count, IsUnidirectional()));
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ // We have notified peer about current max.
+ EXPECT_CALL(delegate_, SendMaxStreams(stream_count, IsUnidirectional()))
+ .Times(0);
+ } else {
+ EXPECT_CALL(delegate_, SendMaxStreams(stream_count, IsUnidirectional()));
+ }
std::string error_details;
EXPECT_TRUE(stream_id_manager_.OnStreamsBlockedFrame(frame, &error_details));
}
@@ -398,7 +403,12 @@
// Check that receipt of a STREAMS BLOCKED with stream-count = 0 invokes a
// MAX STREAMS, count = 123, when the MaxOpen... is set to 123.
EXPECT_CALL(delegate_, SendMaxStreams(123u, IsUnidirectional()));
- stream_id_manager_.SetMaxOpenIncomingStreams(123);
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ QuicStreamIdManagerPeer::set_incoming_actual_max_streams(
+ &stream_id_manager_, 123);
+ } else {
+ stream_id_manager_.SetMaxOpenIncomingStreams(123);
+ }
frame.stream_count = 0;
EXPECT_TRUE(stream_id_manager_.OnStreamsBlockedFrame(frame, &error_details));
}
diff --git a/quic/core/uber_quic_stream_id_manager_test.cc b/quic/core/uber_quic_stream_id_manager_test.cc
index 7cae0a6..b3dfedc 100644
--- a/quic/core/uber_quic_stream_id_manager_test.cc
+++ b/quic/core/uber_quic_stream_id_manager_test.cc
@@ -287,18 +287,32 @@
QuicStreamsBlockedFrame frame(kInvalidControlFrameId, stream_count,
/*unidirectional=*/false);
- EXPECT_CALL(delegate_,
- SendMaxStreams(manager_.max_incoming_bidirectional_streams(),
- frame.unidirectional));
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ EXPECT_CALL(delegate_,
+ SendMaxStreams(manager_.max_incoming_bidirectional_streams(),
+ frame.unidirectional))
+ .Times(0);
+ } else {
+ EXPECT_CALL(delegate_,
+ SendMaxStreams(manager_.max_incoming_bidirectional_streams(),
+ frame.unidirectional));
+ }
EXPECT_TRUE(manager_.OnStreamsBlockedFrame(frame, nullptr));
stream_count = manager_.advertised_max_incoming_unidirectional_streams() - 1;
frame.stream_count = stream_count;
frame.unidirectional = true;
- EXPECT_CALL(delegate_,
- SendMaxStreams(manager_.max_incoming_unidirectional_streams(),
- frame.unidirectional));
+ if (GetQuicReloadableFlag(quic_stop_sending_duplicate_max_streams)) {
+ EXPECT_CALL(delegate_,
+ SendMaxStreams(manager_.max_incoming_unidirectional_streams(),
+ frame.unidirectional))
+ .Times(0);
+ } else {
+ EXPECT_CALL(delegate_,
+ SendMaxStreams(manager_.max_incoming_unidirectional_streams(),
+ frame.unidirectional));
+ }
EXPECT_TRUE(manager_.OnStreamsBlockedFrame(frame, nullptr));
}