Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(639)

Unified Diff: net/quic/chromium/quic_stream_factory.cc

Issue 2820573004: Remove the code to store and load QUIC server configs in the disk cache. (Closed)
Patch Set: Fix Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/chromium/quic_stream_factory.h ('k') | net/quic/chromium/quic_stream_factory_peer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « net/quic/chromium/quic_stream_factory.h ('k') | net/quic/chromium/quic_stream_factory_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698