Home | History | Annotate | Download | only in dns
      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 
     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 
     25 HostCache::Entry::Entry(int error, const AddressList& addrlist)
     26     : error(error),
     27       addrlist(addrlist),
     28       ttl(base::TimeDelta::FromSeconds(-1)) {
     29 }
     30 
     31 HostCache::Entry::~Entry() {
     32 }
     33 
     34 //-----------------------------------------------------------------------------
     35 
     36 HostCache::HostCache(size_t max_entries)
     37     : entries_(max_entries) {
     38 }
     39 
     40 HostCache::~HostCache() {
     41 }
     42 
     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 
     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 
     63 void HostCache::clear() {
     64   DCHECK(CalledOnValidThread());
     65   entries_.Clear();
     66 }
     67 
     68 size_t HostCache::size() const {
     69   DCHECK(CalledOnValidThread());
     70   return entries_.size();
     71 }
     72 
     73 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.
     79 const HostCache::EntryMap& HostCache::entries() const {
     80   DCHECK(CalledOnValidThread());
     81   return entries_;
     82 }
     83 
     84 // static
     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 
    101 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