| Index: net/quic/chromium/quic_stream_factory.cc
|
| diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc
|
| index ff9a91a763c53ea095a28123b44cdc405676fcd3..e334ede49aa69f0368b997bc76fbab0bee8bb002 100644
|
| --- a/net/quic/chromium/quic_stream_factory.cc
|
| +++ b/net/quic/chromium/quic_stream_factory.cc
|
| @@ -331,16 +331,8 @@ class QuicStreamFactory::Job {
|
| const QuicSessionKey& key,
|
| bool was_alternative_service_recently_broken,
|
| int cert_verify_flags,
|
| - std::unique_ptr<QuicServerInfo> server_info,
|
| const NetLogWithSource& net_log);
|
|
|
| - // Creates a new job to handle the resumption of for connecting an
|
| - // existing session.
|
| - Job(QuicStreamFactory* factory,
|
| - HostResolver* host_resolver,
|
| - QuicChromiumClientSession* session,
|
| - const QuicSessionKey& key);
|
| -
|
| ~Job();
|
|
|
| int Run(const CompletionCallback& callback);
|
| @@ -348,19 +340,13 @@ class QuicStreamFactory::Job {
|
| int DoLoop(int rv);
|
| int DoResolveHost();
|
| int DoResolveHostComplete(int rv);
|
| - int DoLoadServerInfo();
|
| - int DoLoadServerInfoComplete(int rv);
|
| int DoConnect();
|
| int DoConnectComplete(int rv);
|
|
|
| void OnIOComplete(int rv);
|
|
|
| - void RunAuxilaryJob();
|
| -
|
| void Cancel();
|
|
|
| - void CancelWaitForDataReadyCallback();
|
| -
|
| const QuicSessionKey& key() const { return key_; }
|
|
|
| const NetLogWithSource& net_log() const { return net_log_; }
|
| @@ -375,8 +361,6 @@ class QuicStreamFactory::Job {
|
| STATE_NONE,
|
| STATE_RESOLVE_HOST,
|
| STATE_RESOLVE_HOST_COMPLETE,
|
| - STATE_LOAD_SERVER_INFO,
|
| - STATE_LOAD_SERVER_INFO_COMPLETE,
|
| STATE_CONNECT,
|
| STATE_CONNECT_COMPLETE,
|
| };
|
| @@ -388,8 +372,6 @@ class QuicStreamFactory::Job {
|
| const QuicSessionKey key_;
|
| const int cert_verify_flags_;
|
| const bool was_alternative_service_recently_broken_;
|
| - std::unique_ptr<QuicServerInfo> server_info_;
|
| - bool started_another_job_;
|
| const NetLogWithSource net_log_;
|
| int num_sent_client_hellos_;
|
| QuicChromiumClientSession* session_;
|
| @@ -406,7 +388,6 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory,
|
| const QuicSessionKey& key,
|
| bool was_alternative_service_recently_broken,
|
| int cert_verify_flags,
|
| - std::unique_ptr<QuicServerInfo> server_info,
|
| const NetLogWithSource& net_log)
|
| : io_state_(STATE_RESOLVE_HOST),
|
| factory_(factory),
|
| @@ -415,8 +396,6 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory,
|
| cert_verify_flags_(cert_verify_flags),
|
| was_alternative_service_recently_broken_(
|
| was_alternative_service_recently_broken),
|
| - server_info_(std::move(server_info)),
|
| - started_another_job_(false),
|
| net_log_(
|
| NetLogWithSource::Make(net_log.net_log(),
|
| NetLogSourceType::QUIC_STREAM_FACTORY_JOB)),
|
| @@ -438,10 +417,6 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory,
|
| QuicStreamFactory::Job::~Job() {
|
| net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB);
|
| DCHECK(callback_.is_null());
|
| -
|
| - // If disk cache has a pending WaitForDataReadyCallback, cancel that callback.
|
| - if (server_info_)
|
| - server_info_->ResetWaitForDataReadyCallback();
|
| }
|
|
|
| int QuicStreamFactory::Job::Run(const CompletionCallback& callback) {
|
| @@ -465,13 +440,6 @@ int QuicStreamFactory::Job::DoLoop(int rv) {
|
| case STATE_RESOLVE_HOST_COMPLETE:
|
| rv = DoResolveHostComplete(rv);
|
| break;
|
| - case STATE_LOAD_SERVER_INFO:
|
| - CHECK_EQ(OK, rv);
|
| - rv = DoLoadServerInfo();
|
| - break;
|
| - case STATE_LOAD_SERVER_INFO_COMPLETE:
|
| - rv = DoLoadServerInfoComplete(rv);
|
| - break;
|
| case STATE_CONNECT:
|
| CHECK_EQ(OK, rv);
|
| rv = DoConnect();
|
| @@ -493,13 +461,6 @@ void QuicStreamFactory::Job::OnIOComplete(int rv) {
|
| base::ResetAndReturn(&callback_).Run(rv);
|
| }
|
|
|
| -void QuicStreamFactory::Job::RunAuxilaryJob() {
|
| - int rv = Run(base::Bind(&QuicStreamFactory::OnJobComplete,
|
| - base::Unretained(factory_), this));
|
| - if (rv != ERR_IO_PENDING)
|
| - factory_->OnJobComplete(this, rv);
|
| -}
|
| -
|
| void QuicStreamFactory::Job::Cancel() {
|
| callback_.Reset();
|
| if (session_)
|
| @@ -508,24 +469,12 @@ void QuicStreamFactory::Job::Cancel() {
|
| ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
|
| }
|
|
|
| -void QuicStreamFactory::Job::CancelWaitForDataReadyCallback() {
|
| - // If we are waiting for WaitForDataReadyCallback, then cancel the callback.
|
| - if (io_state_ != STATE_LOAD_SERVER_INFO_COMPLETE)
|
| - return;
|
| - server_info_->CancelWaitForDataReadyCallback();
|
| - OnIOComplete(OK);
|
| -}
|
| -
|
| size_t QuicStreamFactory::Job::EstimateMemoryUsage() const {
|
| - return base::trace_event::EstimateMemoryUsage(key_) +
|
| - base::trace_event::EstimateMemoryUsage(server_info_);
|
| + return base::trace_event::EstimateMemoryUsage(key_);
|
| }
|
|
|
| int QuicStreamFactory::Job::DoResolveHost() {
|
| dns_resolution_start_time_ = base::TimeTicks::Now();
|
| - // Start loading the data now, and wait for it after we resolve the host.
|
| - if (server_info_)
|
| - server_info_->Start();
|
|
|
| io_state_ = STATE_RESOLVE_HOST_COMPLETE;
|
| return host_resolver_->Resolve(
|
| @@ -547,71 +496,6 @@ int QuicStreamFactory::Job::DoResolveHostComplete(int rv) {
|
| if (factory_->OnResolution(key_, address_list_))
|
| return OK;
|
|
|
| - if (server_info_)
|
| - io_state_ = STATE_LOAD_SERVER_INFO;
|
| - else
|
| - io_state_ = STATE_CONNECT;
|
| - return OK;
|
| -}
|
| -
|
| -int QuicStreamFactory::Job::DoLoadServerInfo() {
|
| - net_log_.BeginEvent(
|
| - NetLogEventType::QUIC_STREAM_FACTORY_JOB_LOAD_SERVER_INFO);
|
| -
|
| - io_state_ = STATE_LOAD_SERVER_INFO_COMPLETE;
|
| -
|
| - DCHECK(server_info_);
|
| -
|
| - // To mitigate the effects of disk cache taking too long to load QUIC server
|
| - // information, set up a timer to cancel WaitForDataReady's callback.
|
| - if (factory_->load_server_info_timeout_srtt_multiplier_ > 0) {
|
| - const int kMaxLoadServerInfoTimeoutMs = 50;
|
| - // Wait for DiskCache a maximum of 50ms.
|
| - int64_t load_server_info_timeout_ms =
|
| - std::min(static_cast<int>(
|
| - (factory_->load_server_info_timeout_srtt_multiplier_ *
|
| - factory_->GetServerNetworkStatsSmoothedRttInMicroseconds(
|
| - key_.server_id())) /
|
| - 1000),
|
| - kMaxLoadServerInfoTimeoutMs);
|
| - if (load_server_info_timeout_ms > 0) {
|
| - factory_->task_runner_->PostDelayedTask(
|
| - FROM_HERE,
|
| - base::Bind(&QuicStreamFactory::Job::CancelWaitForDataReadyCallback,
|
| - GetWeakPtr()),
|
| - base::TimeDelta::FromMilliseconds(load_server_info_timeout_ms));
|
| - }
|
| - }
|
| -
|
| - int rv = server_info_->WaitForDataReady(
|
| - base::Bind(&QuicStreamFactory::Job::OnIOComplete, GetWeakPtr()));
|
| - if (rv == ERR_IO_PENDING && factory_->enable_connection_racing()) {
|
| - // If we are waiting to load server config from the disk cache, then start
|
| - // another job.
|
| - started_another_job_ = true;
|
| - factory_->CreateAuxilaryJob(key_, cert_verify_flags_, net_log_);
|
| - }
|
| - return rv;
|
| -}
|
| -
|
| -int QuicStreamFactory::Job::DoLoadServerInfoComplete(int rv) {
|
| - net_log_.EndEvent(NetLogEventType::QUIC_STREAM_FACTORY_JOB_LOAD_SERVER_INFO);
|
| - UMA_HISTOGRAM_TIMES("Net.QuicServerInfo.DiskCacheWaitForDataReadyTime",
|
| - base::TimeTicks::Now() - dns_resolution_end_time_);
|
| -
|
| - if (rv != OK)
|
| - server_info_.reset();
|
| -
|
| - if (started_another_job_ &&
|
| - (!server_info_ || server_info_->state().server_config.empty() ||
|
| - !factory_->CryptoConfigCacheIsEmpty(key_.server_id()))) {
|
| - // If we have started another job and if we didn't load the server config
|
| - // from the disk cache or if we have received a new server config from the
|
| - // server, then cancel the current job.
|
| - io_state_ = STATE_NONE;
|
| - return ERR_CONNECTION_CLOSED;
|
| - }
|
| -
|
| io_state_ = STATE_CONNECT;
|
| return OK;
|
| }
|
| @@ -625,10 +509,10 @@ int QuicStreamFactory::Job::DoConnect() {
|
| NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT,
|
| NetLog::BoolCallback("require_confirmation", require_confirmation));
|
|
|
| - int rv = factory_->CreateSession(
|
| - key_, cert_verify_flags_, std::move(server_info_), require_confirmation,
|
| - address_list_, dns_resolution_start_time_, dns_resolution_end_time_,
|
| - net_log_, &session_);
|
| + int rv =
|
| + factory_->CreateSession(key_, cert_verify_flags_, require_confirmation,
|
| + address_list_, dns_resolution_start_time_,
|
| + dns_resolution_end_time_, net_log_, &session_);
|
| if (rv != OK) {
|
| DCHECK(rv != ERR_IO_PENDING);
|
| DCHECK(!session_);
|
| @@ -771,11 +655,8 @@ QuicStreamFactory::QuicStreamFactory(
|
| size_t max_packet_length,
|
| const std::string& user_agent_id,
|
| const QuicVersionVector& supported_versions,
|
| - float load_server_info_timeout_srtt_multiplier,
|
| - bool enable_connection_racing,
|
| bool enable_non_blocking_io,
|
| - bool disable_disk_cache,
|
| - int max_server_configs_stored_in_properties,
|
| + bool store_server_configs_in_properties,
|
| bool close_sessions_on_ip_change,
|
| bool mark_quic_broken_when_network_blackholes,
|
| int idle_connection_timeout_seconds,
|
| @@ -813,13 +694,10 @@ QuicStreamFactory::QuicStreamFactory(
|
| transport_security_state,
|
| cert_transparency_verifier))),
|
| supported_versions_(supported_versions),
|
| - load_server_info_timeout_srtt_multiplier_(
|
| - load_server_info_timeout_srtt_multiplier),
|
| - enable_connection_racing_(enable_connection_racing),
|
| enable_non_blocking_io_(enable_non_blocking_io),
|
| - disable_disk_cache_(disable_disk_cache),
|
| mark_quic_broken_when_network_blackholes_(
|
| mark_quic_broken_when_network_blackholes),
|
| + store_server_configs_in_properties_(store_server_configs_in_properties),
|
| ping_timeout_(QuicTime::Delta::FromSeconds(kPingTimeoutSecs)),
|
| reduced_ping_timeout_(
|
| QuicTime::Delta::FromSeconds(reduced_ping_timeout_seconds)),
|
| @@ -838,7 +716,6 @@ QuicStreamFactory::QuicStreamFactory(
|
| do_not_fragment_(do_not_fragment),
|
| estimate_initial_rtt(estimate_initial_rtt),
|
| check_persisted_supports_quic_(true),
|
| - has_initialized_data_(false),
|
| num_push_streams_created_(0),
|
| task_runner_(nullptr),
|
| ssl_config_service_(ssl_config_service),
|
| @@ -866,13 +743,6 @@ QuicStreamFactory::QuicStreamFactory(
|
| has_aes_hardware_support);
|
| if (has_aes_hardware_support)
|
| crypto_config_.PreferAesGcm();
|
| - // When disk cache is used to store the server configs, HttpCache code calls
|
| - // |set_quic_server_info_factory| if |quic_server_info_factory_| wasn't
|
| - // created.
|
| - if (max_server_configs_stored_in_properties > 0) {
|
| - quic_server_info_factory_.reset(
|
| - new PropertiesBasedQuicServerInfoFactory(http_server_properties_));
|
| - }
|
|
|
| // migrate_sessions_early should only be set to true if
|
| // migrate_sessions_on_network_change is set to true.
|
| @@ -930,11 +800,6 @@ base::TimeDelta QuicStreamFactory::GetTimeDelayForWaitingJob(
|
| return base::TimeDelta::FromMicroseconds(srtt);
|
| }
|
|
|
| -void QuicStreamFactory::set_quic_server_info_factory(
|
| - QuicServerInfoFactory* quic_server_info_factory) {
|
| - quic_server_info_factory_.reset(quic_server_info_factory);
|
| -}
|
| -
|
| void QuicStreamFactory::DumpMemoryStats(
|
| base::trace_event::ProcessMemoryDump* pmd,
|
| const std::string& parent_absolute_name) const {
|
| @@ -1069,25 +934,12 @@ int QuicStreamFactory::Create(const QuicServerId& server_id,
|
| if (!task_runner_)
|
| task_runner_ = base::ThreadTaskRunnerHandle::Get().get();
|
|
|
| - std::unique_ptr<QuicServerInfo> quic_server_info;
|
| - if (quic_server_info_factory_.get()) {
|
| - bool load_from_disk_cache = !disable_disk_cache_;
|
| - MaybeInitialize();
|
| - if (!base::ContainsKey(quic_supported_servers_at_startup_, destination)) {
|
| - // 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 && CryptoConfigCacheIsEmpty(server_id))
|
| - quic_server_info = quic_server_info_factory_->GetForServer(server_id);
|
| - }
|
| -
|
| ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log));
|
|
|
| QuicSessionKey key(destination, server_id);
|
| std::unique_ptr<Job> job = base::MakeUnique<Job>(
|
| this, host_resolver_, key, WasQuicRecentlyBroken(server_id),
|
| - cert_verify_flags, std::move(quic_server_info), net_log);
|
| + cert_verify_flags, net_log);
|
| int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete,
|
| base::Unretained(this), job.get()));
|
| if (rv == ERR_IO_PENDING) {
|
| @@ -1133,18 +985,6 @@ size_t QuicStreamFactory::QuicSessionKey::EstimateMemoryUsage() const {
|
| EstimateServerIdMemoryUsage(server_id_);
|
| }
|
|
|
| -void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key,
|
| - int cert_verify_flags,
|
| - const NetLogWithSource& net_log) {
|
| - Job* aux_job =
|
| - new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()),
|
| - cert_verify_flags, nullptr, net_log);
|
| - active_jobs_[key.server_id()][aux_job] = base::WrapUnique(aux_job);
|
| - task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob,
|
| - aux_job->GetWeakPtr()));
|
| -}
|
| -
|
| bool QuicStreamFactory::OnResolution(const QuicSessionKey& key,
|
| const AddressList& address_list) {
|
| const QuicServerId& server_id(key.server_id());
|
| @@ -1643,7 +1483,6 @@ int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket,
|
| int QuicStreamFactory::CreateSession(
|
| const QuicSessionKey& key,
|
| int cert_verify_flags,
|
| - std::unique_ptr<QuicServerInfo> server_info,
|
| bool require_confirmation,
|
| const AddressList& address_list,
|
| base::TimeTicks dns_resolution_start_time,
|
| @@ -1672,7 +1511,13 @@ int QuicStreamFactory::CreateSession(
|
| alarm_factory_.reset(new QuicChromiumAlarmFactory(
|
| base::ThreadTaskRunnerHandle::Get().get(), clock_));
|
| }
|
| +
|
| QuicConnectionId connection_id = random_generator_->RandUint64();
|
| + std::unique_ptr<QuicServerInfo> server_info;
|
| + if (store_server_configs_in_properties_) {
|
| + server_info = base::MakeUnique<PropertiesBasedQuicServerInfo>(
|
| + server_id, http_server_properties_);
|
| + }
|
| InitializeCachedStateInCryptoConfig(server_id, server_info, &connection_id);
|
|
|
| QuicChromiumPacketWriter* writer = new QuicChromiumPacketWriter(socket.get());
|
| @@ -1694,14 +1539,6 @@ int QuicStreamFactory::CreateSession(
|
| if (force_hol_blocking_)
|
| config.SetForceHolBlocking();
|
|
|
| - if (quic_server_info_factory_.get() && !server_info) {
|
| - // Start the disk cache loading so that we can persist the newer QUIC server
|
| - // information and/or inform the disk cache that we have reused
|
| - // |server_info|.
|
| - server_info = quic_server_info_factory_->GetForServer(server_id);
|
| - server_info->Start();
|
| - }
|
| -
|
| // Use the factory to create a new socket performance watcher, and pass the
|
| // ownership to QuicChromiumClientSession.
|
| std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher;
|
| @@ -1844,20 +1681,9 @@ void QuicStreamFactory::InitializeCachedStateInCryptoConfig(
|
| if (!cached->IsEmpty())
|
| return;
|
|
|
| - // |server_info| will be NULL, if a non-empty server config already exists in
|
| - // the memory cache.
|
| - if (!server_info)
|
| + if (!server_info || !server_info->Load())
|
| return;
|
|
|
| - // TODO(rtenneti): Delete the following histogram after collecting stats.
|
| - // If the AlternativeServiceMap contained an entry for this host, check if
|
| - // the disk cache contained an entry for it.
|
| - if (base::ContainsKey(quic_supported_servers_at_startup_,
|
| - server_id.host_port_pair())) {
|
| - UMA_HISTOGRAM_BOOLEAN("Net.QuicServerInfo.ExpectConfigMissingFromDiskCache",
|
| - server_info->state().server_config.empty());
|
| - }
|
| -
|
| cached->Initialize(server_info->state().server_config,
|
| server_info->state().source_address_token,
|
| server_info->state().certs, server_info->state().cert_sct,
|
| @@ -1866,60 +1692,6 @@ void QuicStreamFactory::InitializeCachedStateInCryptoConfig(
|
| QuicWallTime::Zero());
|
| }
|
|
|
| -void QuicStreamFactory::MaybeInitialize() {
|
| - // We don't initialize data from HttpServerProperties in the constructor
|
| - // because HttpServerProperties has not yet initialized. We're guaranteed
|
| - // HttpServerProperties has been initialized by the first time a request is
|
| - // made.
|
| - if (has_initialized_data_)
|
| - return;
|
| -
|
| - has_initialized_data_ = true;
|
| -
|
| - // Query the proxy delegate for the default alternative proxy server.
|
| - ProxyServer default_alternative_proxy_server =
|
| - proxy_delegate_ ? proxy_delegate_->GetDefaultAlternativeProxy()
|
| - : ProxyServer();
|
| - if (default_alternative_proxy_server.is_quic()) {
|
| - quic_supported_servers_at_startup_.insert(
|
| - default_alternative_proxy_server.host_port_pair());
|
| - }
|
| -
|
| - for (const std::pair<const url::SchemeHostPort, AlternativeServiceInfoVector>&
|
| - key_value : http_server_properties_->alternative_service_map()) {
|
| - HostPortPair host_port_pair(key_value.first.host(), key_value.first.port());
|
| - for (const AlternativeServiceInfo& alternative_service_info :
|
| - key_value.second) {
|
| - if (alternative_service_info.alternative_service.protocol == kProtoQUIC) {
|
| - quic_supported_servers_at_startup_.insert(host_port_pair);
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (http_server_properties_->max_server_configs_stored_in_properties() == 0)
|
| - return;
|
| - // Create a temporary QuicServerInfo object to deserialize and to populate the
|
| - // in-memory crypto server config cache in the MRU order.
|
| - std::unique_ptr<QuicServerInfo> server_info;
|
| - CompletionCallback callback;
|
| - // Get the list of servers to be deserialized first because WaitForDataReady
|
| - // touches quic_server_info_map.
|
| - const QuicServerInfoMap& quic_server_info_map =
|
| - http_server_properties_->quic_server_info_map();
|
| - std::vector<QuicServerId> server_list;
|
| - for (const auto& key_value : quic_server_info_map)
|
| - server_list.push_back(key_value.first);
|
| - for (auto it = server_list.rbegin(); it != server_list.rend(); ++it) {
|
| - const QuicServerId& server_id = *it;
|
| - server_info = quic_server_info_factory_->GetForServer(server_id);
|
| - if (server_info->WaitForDataReady(callback) == OK) {
|
| - DVLOG(1) << "Initialized server config for: " << server_id.ToString();
|
| - InitializeCachedStateInCryptoConfig(server_id, server_info, nullptr);
|
| - }
|
| - }
|
| -}
|
| -
|
| void QuicStreamFactory::ProcessGoingAwaySession(
|
| QuicChromiumClientSession* session,
|
| const QuicServerId& server_id,
|
|
|