diff options
-rw-r--r-- | chrome/browser/io_thread.cc | 13 | ||||
-rw-r--r-- | chrome/browser/io_thread.h | 5 | ||||
-rw-r--r-- | chrome/browser/io_thread_unittest.cc | 29 | ||||
-rw-r--r-- | net/http/http_network_session.cc | 2 | ||||
-rw-r--r-- | net/http/http_network_session.h | 1 | ||||
-rw-r--r-- | net/quic/quic_stream_factory.cc | 27 | ||||
-rw-r--r-- | net/quic/quic_stream_factory.h | 6 | ||||
-rw-r--r-- | net/quic/quic_stream_factory_test.cc | 1 |
8 files changed, 75 insertions, 9 deletions
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 8f34934..aaf9faa 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc @@ -1060,6 +1060,8 @@ void IOThread::InitializeNetworkSessionParamsFromGlobals( ¶ms->quic_disable_connection_pooling); globals.quic_load_server_info_timeout_ms.CopyToIfSet( ¶ms->quic_load_server_info_timeout_ms); + globals.quic_disable_loading_server_info_for_new_servers.CopyToIfSet( + ¶ms->quic_disable_loading_server_info_for_new_servers); globals.enable_quic_port_selection.CopyToIfSet( ¶ms->enable_quic_port_selection); globals.quic_max_packet_length.CopyToIfSet(¶ms->quic_max_packet_length); @@ -1210,6 +1212,8 @@ void IOThread::ConfigureQuicGlobals( globals->quic_load_server_info_timeout_ms.set( load_server_info_timeout_ms); } + globals->quic_disable_loading_server_info_for_new_servers.set( + ShouldDisableLoadingServerInfoForNewServers(quic_trial_params)); globals->enable_quic_port_selection.set( ShouldEnableQuicPortSelection(command_line)); globals->quic_connection_options = @@ -1374,6 +1378,15 @@ int IOThread::GetQuicLoadServerInfoTimeout( } // static +bool IOThread::ShouldDisableLoadingServerInfoForNewServers( + const VariationParameters& quic_trial_params) { + return LowerCaseEqualsASCII( + GetVariationParam(quic_trial_params, + "disable_loading_server_info_for_new_servers"), + "true"); +} + +// static size_t IOThread::GetQuicMaxPacketLength( const CommandLine& command_line, base::StringPiece quic_trial_group, diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h index 0b2106e..5aa2acf 100644 --- a/chrome/browser/io_thread.h +++ b/chrome/browser/io_thread.h @@ -192,6 +192,7 @@ class IOThread : public content::BrowserThreadDelegate { Optional<bool> quic_always_require_handshake_confirmation; Optional<bool> quic_disable_connection_pooling; Optional<int> quic_load_server_info_timeout_ms; + Optional<bool> quic_disable_loading_server_info_for_new_servers; Optional<size_t> quic_max_packet_length; net::QuicTagVector quic_connection_options; Optional<std::string> quic_user_agent_id; @@ -371,6 +372,10 @@ class IOThread : public content::BrowserThreadDelegate { static int GetQuicLoadServerInfoTimeout( const VariationParameters& quic_trial_params); + // Returns true if QUIC sever information shouldn't be loaded for new servers. + static bool ShouldDisableLoadingServerInfoForNewServers( + const VariationParameters& quic_trial_params); + // Returns the maximum length for QUIC packets, based on any flags in // |command_line| or the field trial. Returns 0 if there is an error // parsing any of the options, or if the default value should be used. diff --git a/chrome/browser/io_thread_unittest.cc b/chrome/browser/io_thread_unittest.cc index e11676a..1a457a4 100644 --- a/chrome/browser/io_thread_unittest.cc +++ b/chrome/browser/io_thread_unittest.cc @@ -133,6 +133,7 @@ TEST_F(IOThreadTest, EnableQuicFromFieldTrialGroup) { EXPECT_FALSE(params.quic_always_require_handshake_confirmation); EXPECT_FALSE(params.quic_disable_connection_pooling); EXPECT_EQ(0, params.quic_load_server_info_timeout_ms); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, EnableQuicFromCommandLine) { @@ -142,6 +143,7 @@ TEST_F(IOThreadTest, EnableQuicFromCommandLine) { net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_TRUE(params.enable_quic); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, EnablePacingFromCommandLine) { @@ -154,6 +156,7 @@ TEST_F(IOThreadTest, EnablePacingFromCommandLine) { net::QuicTagVector options; options.push_back(net::kPACE); EXPECT_EQ(options, params.quic_connection_options); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, EnablePacingFromFieldTrialParams) { @@ -166,6 +169,7 @@ TEST_F(IOThreadTest, EnablePacingFromFieldTrialParams) { net::QuicTagVector options; options.push_back(net::kPACE); EXPECT_EQ(options, params.quic_connection_options); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, PacketLengthFromCommandLine) { @@ -176,6 +180,7 @@ TEST_F(IOThreadTest, PacketLengthFromCommandLine) { net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_EQ(1450u, params.quic_max_packet_length); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, PacketLengthFromFieldTrialParams) { @@ -186,6 +191,7 @@ TEST_F(IOThreadTest, PacketLengthFromFieldTrialParams) { net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_EQ(1450u, params.quic_max_packet_length); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicVersionFromCommandLine) { @@ -199,8 +205,8 @@ TEST_F(IOThreadTest, QuicVersionFromCommandLine) { InitializeNetworkSessionParams(¶ms); net::QuicVersionVector supported_versions; supported_versions.push_back(net::QuicSupportedVersions().back()); - EXPECT_EQ(supported_versions, - params.quic_supported_versions); + EXPECT_EQ(supported_versions, params.quic_supported_versions); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicVersionFromFieldTrialParams) { @@ -213,8 +219,8 @@ TEST_F(IOThreadTest, QuicVersionFromFieldTrialParams) { InitializeNetworkSessionParams(¶ms); net::QuicVersionVector supported_versions; supported_versions.push_back(net::QuicSupportedVersions().back()); - EXPECT_EQ(supported_versions, - params.quic_supported_versions); + EXPECT_EQ(supported_versions, params.quic_supported_versions); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicConnectionOptionsFromCommandLine) { @@ -232,6 +238,7 @@ TEST_F(IOThreadTest, QuicConnectionOptionsFromCommandLine) { options.push_back(net::kTBBR); options.push_back(net::kREJ); EXPECT_EQ(options, params.quic_connection_options); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicConnectionOptionsFromFieldTrialParams) { @@ -248,6 +255,7 @@ TEST_F(IOThreadTest, QuicConnectionOptionsFromFieldTrialParams) { options.push_back(net::kTBBR); options.push_back(net::kREJ); EXPECT_EQ(options, params.quic_connection_options); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicConnectionOptionsFromDeprecatedFieldTrialParams) { @@ -264,6 +272,7 @@ TEST_F(IOThreadTest, QuicConnectionOptionsFromDeprecatedFieldTrialParams) { options.push_back(net::kTBBR); options.push_back(net::kREJ); EXPECT_EQ(options, params.quic_connection_options); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, @@ -274,6 +283,7 @@ TEST_F(IOThreadTest, net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_TRUE(params.quic_always_require_handshake_confirmation); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, @@ -284,6 +294,7 @@ TEST_F(IOThreadTest, net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_TRUE(params.quic_disable_connection_pooling); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, QuicLoadServerInfoTimeoutFromFieldTrialParams) { @@ -293,6 +304,16 @@ TEST_F(IOThreadTest, QuicLoadServerInfoTimeoutFromFieldTrialParams) { net::HttpNetworkSession::Params params; InitializeNetworkSessionParams(¶ms); EXPECT_EQ(50, params.quic_load_server_info_timeout_ms); + EXPECT_FALSE(params.quic_disable_loading_server_info_for_new_servers); +} + +TEST_F(IOThreadTest, QuicDisableLoadingServerInfoForNewServers) { + field_trial_group_ = "Enabled"; + field_trial_params_["disable_loading_server_info_for_new_servers"] = "true"; + ConfigureQuicGlobals(); + net::HttpNetworkSession::Params params; + InitializeNetworkSessionParams(¶ms); + EXPECT_TRUE(params.quic_disable_loading_server_info_for_new_servers); } TEST_F(IOThreadTest, diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc index 405c88c..7d7a718 100644 --- a/net/http/http_network_session.cc +++ b/net/http/http_network_session.cc @@ -89,6 +89,7 @@ HttpNetworkSession::Params::Params() quic_always_require_handshake_confirmation(false), quic_disable_connection_pooling(false), quic_load_server_info_timeout_ms(0), + quic_disable_loading_server_info_for_new_servers(false), quic_clock(NULL), quic_random(NULL), quic_max_packet_length(kDefaultMaxPacketSize), @@ -132,6 +133,7 @@ HttpNetworkSession::HttpNetworkSession(const Params& params) params.quic_always_require_handshake_confirmation, params.quic_disable_connection_pooling, params.quic_load_server_info_timeout_ms, + params.quic_disable_loading_server_info_for_new_servers, params.quic_connection_options), spdy_session_pool_(params.host_resolver, params.ssl_config_service, diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h index c9704a4..39605c6 100644 --- a/net/http/http_network_session.h +++ b/net/http/http_network_session.h @@ -117,6 +117,7 @@ class NET_EXPORT HttpNetworkSession bool quic_always_require_handshake_confirmation; bool quic_disable_connection_pooling; int quic_load_server_info_timeout_ms; + bool quic_disable_loading_server_info_for_new_servers; HostPortPair origin_to_force_quic_on; QuicClock* quic_clock; // Will be owned by QuicStreamFactory. QuicRandom* quic_random; diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc index 45c60c0..3253e90 100644 --- a/net/quic/quic_stream_factory.cc +++ b/net/quic/quic_stream_factory.cc @@ -545,6 +545,7 @@ QuicStreamFactory::QuicStreamFactory( bool always_require_handshake_confirmation, bool disable_connection_pooling, int load_server_info_timeout, + bool disable_loading_server_info_for_new_servers, const QuicTagVector& connection_options) : require_confirmation_(true), host_resolver_(host_resolver), @@ -563,6 +564,8 @@ QuicStreamFactory::QuicStreamFactory( always_require_handshake_confirmation), disable_connection_pooling_(disable_connection_pooling), load_server_info_timeout_ms_(load_server_info_timeout), + disable_loading_server_info_for_new_servers_( + disable_loading_server_info_for_new_servers), port_seed_(random_generator_->RandUint64()), check_persisted_supports_quic_(true), task_runner_(nullptr), @@ -623,11 +626,25 @@ int QuicStreamFactory::Create(const HostPortPair& host_port_pair, QuicServerInfo* quic_server_info = nullptr; if (quic_server_info_factory_) { - QuicCryptoClientConfig::CachedState* cached = - crypto_config_.LookupOrCreate(server_id); - DCHECK(cached); - if (cached->IsEmpty()) { - quic_server_info = quic_server_info_factory_->GetForServer(server_id); + bool load_from_disk_cache = true; + if (disable_loading_server_info_for_new_servers_) { + const AlternateProtocolMap& alternate_protocol_map = + http_server_properties_->alternate_protocol_map(); + AlternateProtocolMap::const_iterator it = + alternate_protocol_map.Peek(server_id.host_port_pair()); + if (it == alternate_protocol_map.end() || it->second.protocol != QUIC) { + // If there is no entry for QUIC, consider that as a new server and + // don't wait for Cache thread to load the data for that server. + load_from_disk_cache = false; + } + } + if (load_from_disk_cache) { + QuicCryptoClientConfig::CachedState* cached = + crypto_config_.LookupOrCreate(server_id); + DCHECK(cached); + if (cached->IsEmpty()) { + quic_server_info = quic_server_info_factory_->GetForServer(server_id); + } } } // TODO(rtenneti): Initialize task_runner_ in the constructor after diff --git a/net/quic/quic_stream_factory.h b/net/quic/quic_stream_factory.h index 2fad1fc..5d24c9b 100644 --- a/net/quic/quic_stream_factory.h +++ b/net/quic/quic_stream_factory.h @@ -105,6 +105,7 @@ class NET_EXPORT_PRIVATE QuicStreamFactory bool always_require_handshake_confirmation, bool disable_connection_pooling, int load_server_info_timeout, + bool disable_loading_server_info_for_new_servers, const QuicTagVector& connection_options); ~QuicStreamFactory() override; @@ -288,6 +289,11 @@ class NET_EXPORT_PRIVATE QuicStreamFactory // |load_server_info_timeout_ms_| to 0. int load_server_info_timeout_ms_; + // Set to disable loading of QUIC server information from disk cache for new + // servers. New servers are those servers for which there is no QUIC protocol + // entry in AlternateProtocolMap. + bool disable_loading_server_info_for_new_servers_; + // Each profile will (probably) have a unique port_seed_ value. This value is // used to help seed a pseudo-random number generator (PortSuggester) so that // we consistently (within this profile) suggest the same ephemeral port when diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index 05234c0..b386527 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc @@ -163,6 +163,7 @@ class QuicStreamFactoryTest : public ::testing::TestWithParam<QuicVersion> { /*always_require_handshake_confirmation=*/false, /*disable_connection_pooling=*/false, /*load_server_info_timeout=*/0u, + /*disable_loading_server_info_for_new_servers=*/false, QuicTagVector()), host_port_pair_(kDefaultServerHostName, kDefaultServerPort), is_https_(false), |