| Index: net/base/host_resolver_impl.cc
|
| diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc
|
| index d9e1aa2b7e79fa2e2eafe49c6e54f2ec36fee623..7f785b2733f975c007c4d31ed3c59be775ccf26e 100644
|
| --- a/net/base/host_resolver_impl.cc
|
| +++ b/net/base/host_resolver_impl.cc
|
| @@ -205,6 +205,12 @@ void RecordTotalTime(bool had_dns_config,
|
| }
|
| }
|
|
|
| +void RecordTTL(base::TimeDelta ttl) {
|
| + UMA_HISTOGRAM_CUSTOM_TIMES("AsyncDNS.TTL", ttl,
|
| + base::TimeDelta::FromSeconds(1),
|
| + base::TimeDelta::FromDays(1), 100);
|
| +}
|
| +
|
| //-----------------------------------------------------------------------------
|
|
|
| // Wraps call to SystemHostResolverProc as an instance of HostResolverProc.
|
| @@ -1331,7 +1337,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| // If we were called from a Request's callback within CompleteRequests,
|
| // that Request could not have been cancelled, so num_active_requests()
|
| // could not be 0. Therefore, we are not in CompleteRequests().
|
| - CompleteRequests(OK, AddressList(), base::TimeDelta());
|
| + CompleteRequestsWithError(OK /* cancelled */);
|
| }
|
| }
|
|
|
| @@ -1339,7 +1345,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| // and destroys the job.
|
| void Abort() {
|
| DCHECK(is_running());
|
| - CompleteRequests(ERR_ABORTED, AddressList(), base::TimeDelta());
|
| + CompleteRequestsWithError(ERR_ABORTED);
|
| }
|
|
|
| // Called by HostResolverImpl when this job is evicted due to queue overflow.
|
| @@ -1352,9 +1358,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| net_log_.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_EVICTED);
|
|
|
| // This signals to CompleteRequests that this job never ran.
|
| - CompleteRequests(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE,
|
| - AddressList(),
|
| - base::TimeDelta());
|
| + CompleteRequestsWithError(ERR_HOST_RESOLVER_QUEUE_TOO_LARGE);
|
| }
|
|
|
| // Attempts to serve the job from HOSTS. Returns true if succeeded and
|
| @@ -1366,7 +1370,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| requests_.front()->info(),
|
| &addr_list)) {
|
| // This will destroy the Job.
|
| - CompleteRequests(OK, addr_list, base::TimeDelta());
|
| + CompleteRequests(OK, addr_list, base::TimeDelta(), false /* true_ttl */);
|
| return true;
|
| }
|
| return false;
|
| @@ -1464,12 +1468,12 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| }
|
| }
|
|
|
| - base::TimeDelta ttl = base::TimeDelta::FromSeconds(
|
| - kNegativeCacheEntryTTLSeconds);
|
| + base::TimeDelta ttl =
|
| + base::TimeDelta::FromSeconds(kNegativeCacheEntryTTLSeconds);
|
| if (net_error == OK)
|
| ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds);
|
|
|
| - CompleteRequests(net_error, addr_list, ttl);
|
| + CompleteRequests(net_error, addr_list, ttl, false /* true_ttl */);
|
| }
|
|
|
| void StartDnsTask() {
|
| @@ -1509,14 +1513,16 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| }
|
|
|
| UmaAsyncDnsResolveStatus(RESOLVE_STATUS_DNS_SUCCESS);
|
| + RecordTTL(ttl);
|
|
|
| - CompleteRequests(net_error, addr_list, ttl);
|
| + CompleteRequests(net_error, addr_list, ttl, true /* true_ttl */);
|
| }
|
|
|
| // Performs Job's last rites. Completes all Requests. Deletes this.
|
| void CompleteRequests(int net_error,
|
| const AddressList& addr_list,
|
| - base::TimeDelta ttl) {
|
| + base::TimeDelta ttl,
|
| + bool true_ttl) {
|
| CHECK(resolver_);
|
|
|
| // This job must be removed from resolver's |jobs_| now to make room for a
|
| @@ -1527,8 +1533,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
|
|
| resolver_->RemoveJob(this);
|
|
|
| - // |addr_list| will be destroyed once we destroy |proc_task_| and
|
| - // |dns_task_|.
|
| + // |addr_list| will be destroyed with |proc_task_| and |dns_task_|.
|
| AddressList list = addr_list;
|
|
|
| if (is_running()) {
|
| @@ -1568,8 +1573,12 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
|
|
| bool did_complete = (net_error != ERR_ABORTED) &&
|
| (net_error != ERR_HOST_RESOLVER_QUEUE_TOO_LARGE);
|
| - if (did_complete)
|
| - resolver_->CacheResult(key_, net_error, list, ttl);
|
| + if (did_complete) {
|
| + HostCache::Entry entry = true_ttl ?
|
| + HostCache::Entry(net_error, list, ttl) :
|
| + HostCache::Entry(net_error, list);
|
| + resolver_->CacheResult(key_, entry, ttl);
|
| + }
|
|
|
| // Complete all of the requests that were attached to the job.
|
| for (RequestsList::const_iterator it = requests_.begin();
|
| @@ -1597,6 +1606,11 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job {
|
| }
|
| }
|
|
|
| + // Convenience wrapper for CompleteRequests in case of failure.
|
| + void CompleteRequestsWithError(int net_error) {
|
| + CompleteRequests(net_error, AddressList(), base::TimeDelta(), false);
|
| + }
|
| +
|
| RequestPriority priority() const {
|
| return priority_tracker_.highest_priority();
|
| }
|
| @@ -1958,6 +1972,8 @@ bool HostResolverImpl::ServeFromCache(const Key& key,
|
|
|
| *net_error = cache_entry->error;
|
| if (*net_error == OK) {
|
| + if (cache_entry->has_ttl())
|
| + RecordTTL(cache_entry->ttl);
|
| *addresses = cache_entry->addrlist;
|
| EnsurePortOnAddressList(info.port(), addresses);
|
| }
|
| @@ -1998,11 +2014,10 @@ bool HostResolverImpl::ServeFromHosts(const Key& key,
|
| }
|
|
|
| void HostResolverImpl::CacheResult(const Key& key,
|
| - int net_error,
|
| - const AddressList& addr_list,
|
| + const HostCache::Entry& entry,
|
| base::TimeDelta ttl) {
|
| if (cache_.get())
|
| - cache_->Set(key, net_error, addr_list, base::TimeTicks::Now(), ttl);
|
| + cache_->Set(key, entry, base::TimeTicks::Now(), ttl);
|
| }
|
|
|
| void HostResolverImpl::RemoveJob(Job* job) {
|
|
|