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..27bc0e5e3a1aa3cc76a3f19bfdd5f45729fdf834 100644 |
--- a/net/base/host_resolver_impl.cc |
+++ b/net/base/host_resolver_impl.cc |
@@ -205,6 +205,10 @@ void RecordTotalTime(bool had_dns_config, |
} |
} |
+void RecordTTL(base::TimeDelta ttl) { |
+ UMA_HISTOGRAM_CUSTOM_COUNTS("AsyncDNS.TTL", ttl.InSeconds(), 1, 86400, 100); |
+} |
+ |
//----------------------------------------------------------------------------- |
// Wraps call to SystemHostResolverProc as an instance of HostResolverProc. |
@@ -1464,12 +1468,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job { |
} |
} |
- 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, base::TimeDelta::FromSeconds(-1)); |
cbentzel
2012/10/11 18:27:30
At the point that the kNegativeCacheEntry/kCacheEn
|
} |
void StartDnsTask() { |
@@ -1958,6 +1957,8 @@ bool HostResolverImpl::ServeFromCache(const Key& key, |
*net_error = cache_entry->error; |
if (*net_error == OK) { |
+ if (cache_entry->original_ttl >= base::TimeDelta()) |
+ RecordTTL(cache_entry->original_ttl); |
*addresses = cache_entry->addrlist; |
EnsurePortOnAddressList(info.port(), addresses); |
} |
@@ -2001,8 +2002,25 @@ void HostResolverImpl::CacheResult(const Key& key, |
int net_error, |
const AddressList& addr_list, |
base::TimeDelta ttl) { |
- if (cache_.get()) |
- cache_->Set(key, net_error, addr_list, base::TimeTicks::Now(), ttl); |
+ bool have_ttl = (ttl >= base::TimeDelta()); |
+ if (!have_ttl) { |
+ if (net_error == OK) { |
+ ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds); |
+ } else { |
+ ttl = base::TimeDelta::FromSeconds(kNegativeCacheEntryTTLSeconds); |
+ } |
+ } |
+ |
+ if (cache_.get()) { |
+ HostCache::Entry* entry = cache_->Set( |
+ key, net_error, addr_list, base::TimeTicks::Now(), ttl); |
+ if (have_ttl) { |
+ RecordTTL(ttl); |
+ entry->original_ttl = ttl; |
+ } else { |
+ entry->original_ttl = base::TimeDelta::FromSeconds(-1); |
+ } |
+ } |
} |
void HostResolverImpl::RemoveJob(Job* job) { |