• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/dns/host_cache.h"
6 
7 #include "base/logging.h"
8 #include "base/metrics/field_trial.h"
9 #include "base/metrics/histogram.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "net/base/net_errors.h"
12 
13 namespace net {
14 
15 //-----------------------------------------------------------------------------
16 
Entry(int error,const AddressList & addrlist,base::TimeDelta ttl)17 HostCache::Entry::Entry(int error, const AddressList& addrlist,
18                         base::TimeDelta ttl)
19     : error(error),
20       addrlist(addrlist),
21       ttl(ttl) {
22   DCHECK(ttl >= base::TimeDelta());
23 }
24 
Entry(int error,const AddressList & addrlist)25 HostCache::Entry::Entry(int error, const AddressList& addrlist)
26     : error(error),
27       addrlist(addrlist),
28       ttl(base::TimeDelta::FromSeconds(-1)) {
29 }
30 
~Entry()31 HostCache::Entry::~Entry() {
32 }
33 
34 //-----------------------------------------------------------------------------
35 
HostCache(size_t max_entries)36 HostCache::HostCache(size_t max_entries)
37     : entries_(max_entries) {
38 }
39 
~HostCache()40 HostCache::~HostCache() {
41 }
42 
Lookup(const Key & key,base::TimeTicks now)43 const HostCache::Entry* HostCache::Lookup(const Key& key,
44                                           base::TimeTicks now) {
45   DCHECK(CalledOnValidThread());
46   if (caching_is_disabled())
47     return NULL;
48 
49   return entries_.Get(key, now);
50 }
51 
Set(const Key & key,const Entry & entry,base::TimeTicks now,base::TimeDelta ttl)52 void HostCache::Set(const Key& key,
53                     const Entry& entry,
54                     base::TimeTicks now,
55                     base::TimeDelta ttl) {
56   DCHECK(CalledOnValidThread());
57   if (caching_is_disabled())
58     return;
59 
60   entries_.Put(key, entry, now, now + ttl);
61 }
62 
clear()63 void HostCache::clear() {
64   DCHECK(CalledOnValidThread());
65   entries_.Clear();
66 }
67 
size() const68 size_t HostCache::size() const {
69   DCHECK(CalledOnValidThread());
70   return entries_.size();
71 }
72 
max_entries() const73 size_t HostCache::max_entries() const {
74   DCHECK(CalledOnValidThread());
75   return entries_.max_entries();
76 }
77 
78 // Note that this map may contain expired entries.
entries() const79 const HostCache::EntryMap& HostCache::entries() const {
80   DCHECK(CalledOnValidThread());
81   return entries_;
82 }
83 
84 // static
CreateDefaultCache()85 scoped_ptr<HostCache> HostCache::CreateDefaultCache() {
86   // Cache capacity is determined by the field trial.
87 #if defined(ENABLE_BUILT_IN_DNS)
88   const size_t kDefaultMaxEntries = 1000;
89 #else
90   const size_t kDefaultMaxEntries = 100;
91 #endif
92   const size_t kSaneMaxEntries = 1 << 20;
93   size_t max_entries = 0;
94   base::StringToSizeT(base::FieldTrialList::FindFullName("HostCacheSize"),
95                       &max_entries);
96   if ((max_entries == 0) || (max_entries > kSaneMaxEntries))
97     max_entries = kDefaultMaxEntries;
98   return make_scoped_ptr(new HostCache(max_entries));
99 }
100 
Handle(const Key & key,const Entry & entry,const base::TimeTicks & expiration,const base::TimeTicks & now,bool on_get) const101 void HostCache::EvictionHandler::Handle(
102     const Key& key,
103     const Entry& entry,
104     const base::TimeTicks& expiration,
105     const base::TimeTicks& now,
106     bool on_get) const {
107   if (on_get) {
108     DCHECK(now >= expiration);
109     UMA_HISTOGRAM_CUSTOM_TIMES("DNS.CacheExpiredOnGet", now - expiration,
110         base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(1), 100);
111     return;
112   }
113   if (expiration > now) {
114     UMA_HISTOGRAM_CUSTOM_TIMES("DNS.CacheEvicted", expiration - now,
115         base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(1), 100);
116   } else {
117     UMA_HISTOGRAM_CUSTOM_TIMES("DNS.CacheExpired", now - expiration,
118         base::TimeDelta::FromSeconds(1), base::TimeDelta::FromDays(1), 100);
119   }
120 }
121 
122 }  // namespace net
123