gfe-relnote: Check handshake timeout before idle timeout in QuicConnection. Protected by --gfe2_reloadable_flag_quic_check_handshake_timeout_before_idle_timeout. This is an attempt to deflake the PreSharedKey* tests in third_party/quic/core/http:end_to_end_test. PiperOrigin-RevId: 292436192 Change-Id: I1a45df8a29913e295bfc5b06805cbdeae245d44b
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc index 027a2b2..873a893 100644 --- a/quic/core/http/end_to_end_test.cc +++ b/quic/core/http/end_to_end_test.cc
@@ -3733,6 +3733,7 @@ } TEST_P(EndToEndTest, PreSharedKey) { + SetQuicReloadableFlag(quic_check_handshake_timeout_before_idle_timeout, true); client_config_.set_max_time_before_crypto_handshake( QuicTime::Delta::FromSeconds(1)); client_config_.set_max_idle_time_before_crypto_handshake( @@ -3747,6 +3748,7 @@ // TODO: reenable once we have a way to make this run faster. TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyMismatch)) { + SetQuicReloadableFlag(quic_check_handshake_timeout_before_idle_timeout, true); client_config_.set_max_time_before_crypto_handshake( QuicTime::Delta::FromSeconds(1)); client_config_.set_max_idle_time_before_crypto_handshake( @@ -3766,6 +3768,7 @@ // TODO: reenable once we have a way to make this run faster. TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyNoClient)) { + SetQuicReloadableFlag(quic_check_handshake_timeout_before_idle_timeout, true); client_config_.set_max_time_before_crypto_handshake( QuicTime::Delta::FromSeconds(1)); client_config_.set_max_idle_time_before_crypto_handshake( @@ -3778,6 +3781,7 @@ // TODO: reenable once we have a way to make this run faster. TEST_P(EndToEndTest, QUIC_TEST_DISABLED_IN_CHROME(PreSharedKeyNoServer)) { + SetQuicReloadableFlag(quic_check_handshake_timeout_before_idle_timeout, true); client_config_.set_max_time_before_crypto_handshake( QuicTime::Delta::FromSeconds(1)); client_config_.set_max_idle_time_before_crypto_handshake(
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 9a12311..09820f3 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -335,7 +335,9 @@ address_validated_(false), use_handshake_delegate_( GetQuicReloadableFlag(quic_use_handshaker_delegate2) || - version().handshake_protocol == PROTOCOL_TLS1_3) { + version().handshake_protocol == PROTOCOL_TLS1_3), + check_handshake_timeout_before_idle_timeout_(GetQuicReloadableFlag( + quic_check_handshake_timeout_before_idle_timeout)) { QUIC_DLOG(INFO) << ENDPOINT << "Created connection with server connection ID " << server_connection_id << " and version: " << ParsedQuicVersionToString(version()); @@ -349,6 +351,11 @@ QUIC_RELOADABLE_FLAG_COUNT(quic_use_handshaker_delegate2); } + if (check_handshake_timeout_before_idle_timeout_) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_check_handshake_timeout_before_idle_timeout); + } + framer_.set_visitor(this); stats_.connection_creation_time = clock_->ApproximateNow(); // TODO(ianswett): Supply the NetworkChangeVisitor as a constructor argument @@ -3058,6 +3065,25 @@ void QuicConnection::CheckForTimeout() { QuicTime now = clock_->ApproximateNow(); + if (check_handshake_timeout_before_idle_timeout_ && + !handshake_timeout_.IsInfinite()) { + QuicTime::Delta connected_duration = now - stats_.connection_creation_time; + QUIC_DVLOG(1) << ENDPOINT + << "connection time: " << connected_duration.ToMicroseconds() + << " handshake timeout: " + << handshake_timeout_.ToMicroseconds(); + if (connected_duration >= handshake_timeout_) { + const std::string error_details = quiche::QuicheStrCat( + "Handshake timeout expired after ", + connected_duration.ToDebuggingValue(), + ". Timeout:", handshake_timeout_.ToDebuggingValue()); + QUIC_DVLOG(1) << ENDPOINT << error_details; + CloseConnection(QUIC_HANDSHAKE_TIMEOUT, error_details, + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); + return; + } + } + QuicTime time_of_last_packet = std::max(time_of_last_received_packet_, time_of_first_packet_sent_after_receiving_); @@ -3089,7 +3115,8 @@ return; } - if (!handshake_timeout_.IsInfinite()) { + if (!check_handshake_timeout_before_idle_timeout_ && + !handshake_timeout_.IsInfinite()) { QuicTime::Delta connected_duration = now - stats_.connection_creation_time; QUIC_DVLOG(1) << ENDPOINT << "connection time: " << connected_duration.ToMicroseconds()
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h index 5bb3589..bcedee0 100644 --- a/quic/core/quic_connection.h +++ b/quic/core/quic_connection.h
@@ -1517,6 +1517,9 @@ // Latched value of quic_use_handshaker_delegate2. const bool use_handshake_delegate_; + + // Latched value of quic_check_handshake_timeout_before_idle_timeout. + const bool check_handshake_timeout_before_idle_timeout_; }; } // namespace quic