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