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

Unified Diff: net/dns/host_resolver_impl.cc

Issue 2083643003: DNS: Let requests specify a callback for future cache hits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 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
« net/dns/host_resolver.cc ('K') | « net/dns/host_resolver_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/dns/host_resolver_impl.cc
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 2345dad8c741a17ab5ca385cf92380be2f90ef8c..0368dc9646e8bdd0667b8bf8894aed63bf31b110 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -1782,6 +1782,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job,
// Update the net log and notify registered observers.
LogFinishRequest(req->source_net_log(), req->info(), entry.error());
if (did_complete) {
+ resolver_->MaybeAddCacheHitCallback(key_, req->info());
// Record effective total time from creation to completion.
RecordTotalTime(had_dns_config_, req->info().is_speculative(),
base::TimeTicks::Now() - req->request_time());
@@ -1927,6 +1928,7 @@ int HostResolverImpl::Resolve(const RequestInfo& info,
int rv = ResolveHelper(key, info, ip_address_ptr, addresses, false, nullptr,
source_net_log);
if (rv != ERR_DNS_CACHE_MISS) {
+ MaybeAddCacheHitCallback(key, info);
LogFinishRequest(source_net_log, info, rv);
RecordTotalTime(HaveDnsConfig(), info.is_speculative(), base::TimeDelta());
return rv;
@@ -2055,6 +2057,7 @@ int HostResolverImpl::ResolveHelper(const Key& key,
stale_info)) {
source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CACHE_HIT);
// |ServeFromCache()| will set |*stale_info| as needed.
+ RunCacheHitCallbacks(key, info);
return net_error;
}
// TODO(szym): Do not do this if nsswitch.conf instructs not to.
@@ -2303,6 +2306,7 @@ void HostResolverImpl::CacheResult(const Key& key,
base::TimeDelta ttl) {
if (cache_.get())
cache_->Set(key, entry, base::TimeTicks::Now(), ttl);
+ ClearCacheHitCallbacks(key);
Charlie Harrison 2016/07/26 13:41:13 It is not quite clear why we clear the cache hit c
Julia Tuttle 2016/07/26 17:51:24 Done.
}
void HostResolverImpl::RemoveJob(Job* job) {
@@ -2431,8 +2435,10 @@ void HostResolverImpl::OnIPAddressChanged() {
last_ipv6_probe_time_ = base::TimeTicks();
// Abandon all ProbeJobs.
probe_weak_ptr_factory_.InvalidateWeakPtrs();
- if (cache_.get())
+ if (cache_.get()) {
cache_->clear();
+ cache_hit_callbacks_.clear();
+ }
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
RunLoopbackProbeJob();
#endif
@@ -2491,8 +2497,10 @@ void HostResolverImpl::UpdateDNSConfig(bool config_changed) {
// have to drop our internal cache :( Note that OS level DNS caches, such
// as NSCD's cache should be dropped automatically by the OS when
// resolv.conf changes so we don't need to do anything to clear that cache.
- if (cache_.get())
+ if (cache_.get()) {
cache_->clear();
+ cache_hit_callbacks_.clear();
+ }
// Life check to bail once |this| is deleted.
base::WeakPtr<HostResolverImpl> self = weak_ptr_factory_.GetWeakPtr();
@@ -2538,6 +2546,31 @@ void HostResolverImpl::OnDnsTaskResolve(int net_error) {
std::abs(net_error));
}
+void HostResolverImpl::OnCacheEntryEvicted(const HostCache::Key& key,
+ const HostCache::Entry& entry) {
+ ClearCacheHitCallbacks(key);
+}
+
+void HostResolverImpl::ClearCacheHitCallbacks(const HostCache::Key& key) {
Charlie Harrison 2016/07/26 13:41:13 I don't think this method is really necessary.
Julia Tuttle 2016/07/26 17:51:24 Done.
+ cache_hit_callbacks_.erase(key);
+}
+
+void HostResolverImpl::MaybeAddCacheHitCallback(const HostCache::Key& key,
+ const RequestInfo& info) {
+ const RequestInfo::CacheHitCallback& callback = info.cache_hit_callback();
+ if (callback.is_null())
+ return;
+ cache_hit_callbacks_[key].push_back(callback);
+}
+
+void HostResolverImpl::RunCacheHitCallbacks(const HostCache::Key& key,
+ const RequestInfo& info) {
+ if (cache_hit_callbacks_.count(key) == 0u)
Charlie Harrison 2016/07/26 13:41:13 I think using find(key) is clearer here, and only
Julia Tuttle 2016/07/26 17:51:24 Done.
+ return;
+ for (auto& callback : cache_hit_callbacks_[key])
+ callback.Run(info);
+}
+
void HostResolverImpl::SetDnsClient(std::unique_ptr<DnsClient> dns_client) {
// DnsClient and config must be updated before aborting DnsTasks, since doing
// so may start new jobs.
« net/dns/host_resolver.cc ('K') | « net/dns/host_resolver_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698