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