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

Unified Diff: net/dns/host_cache.h

Issue 1908543002: DNS: Retain stale entries in HostCache and return when requested (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make requested changes. Created 4 years, 8 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
Index: net/dns/host_cache.h
diff --git a/net/dns/host_cache.h b/net/dns/host_cache.h
index 752ebeb6c0732f32e6677babe7b517d11ebf0354..a92841636d63d8d81cb0becfc2ac6b7c57ea41d3 100644
--- a/net/dns/host_cache.h
+++ b/net/dns/host_cache.h
@@ -64,17 +64,42 @@ class NET_EXPORT HostCache : NON_EXPORTED_BASE(public base::NonThreadSafe) {
HostResolverFlags host_resolver_flags;
};
- struct EvictionHandler {
- void Handle(const Key& key,
- const Entry& entry,
- const base::TimeTicks& expiration,
- const base::TimeTicks& now,
- bool onGet) const;
+ struct NET_EXPORT EntryStaleness {
+ // Time since the entry's TTL has expired. Negative if not expired.
+ base::TimeDelta expired_by;
+ // Number of network changes since this result was cached.
+ int network_changes;
+ // Number of hits to the cache entry while stale (expired or past-network).
+ int stale_hits;
+
+ bool is_stale() const {
+ return network_changes > 0 || expired_by >= base::TimeDelta();
+ }
+ };
+
+ struct EntryInternal : public Entry {
Ryan Sleevi 2016/04/29 23:09:38 Well, it's not really Internal now. Perhaps a comm
Julia Tuttle 2016/05/03 20:36:19 Done. This is *much* better, thank you.
+ EntryInternal(const Entry& entry,
+ base::TimeTicks now,
+ base::TimeDelta ttl,
+ int network_changes);
+
+ base::TimeTicks expires;
+ // Copied from HostCache::network_changes when this entry is set; can later
+ // be compared to it to see if the entry was received on the current
+ // network.
+ int network_changes;
+ int total_hits;
+ int stale_hits;
+
+ bool IsStale(base::TimeTicks now, int network_changes) const;
+ void CountHit(bool hit_is_stale);
+ void GetStaleness(base::TimeTicks now,
+ int network_changes,
+ EntryStaleness* out) const;
};
- typedef ExpiringCache<Key, Entry, base::TimeTicks,
- std::less<base::TimeTicks>,
- EvictionHandler> EntryMap;
+ // Ditto.
Ryan Sleevi 2016/04/29 23:09:38 Ditto what? This doesn't seem to need to be public
Julia Tuttle 2016/05/03 20:36:19 Done.
+ typedef std::map<Key, EntryInternal> EntryMap;
// Constructs a HostCache that stores up to |max_entries|.
explicit HostCache(size_t max_entries);
@@ -85,6 +110,13 @@ class NET_EXPORT HostCache : NON_EXPORTED_BASE(public base::NonThreadSafe) {
// |now|. If there is no such entry, returns NULL.
const Entry* Lookup(const Key& key, base::TimeTicks now);
+ // Returns a pointer to the entry for |key|, whether it is valid or stale at
+ // time |now|. Fills in |stale_out| with information about how stale it is.
+ // If there is no entry for |key| at all, returns NULL.
+ const Entry* LookupStale(const Key& key,
+ base::TimeTicks now,
+ EntryStaleness* stale_out);
+
// Overwrites or creates an entry for |key|.
// |entry| is the value to set, |now| is the current time
// |ttl| is the "time to live".
@@ -93,6 +125,9 @@ class NET_EXPORT HostCache : NON_EXPORTED_BASE(public base::NonThreadSafe) {
base::TimeTicks now,
base::TimeDelta ttl);
+ // Marks all entries as stale on account of a network change.
+ void OnNetworkChange();
+
// Empties the cache
void clear();
@@ -102,7 +137,7 @@ class NET_EXPORT HostCache : NON_EXPORTED_BASE(public base::NonThreadSafe) {
// Following are used by net_internals UI.
size_t max_entries() const;
- const EntryMap& entries() const;
+ std::unique_ptr<base::Value> GetEntriesAsValue() const;
// Creates a default cache.
static std::unique_ptr<HostCache> CreateDefaultCache();
@@ -110,14 +145,18 @@ class NET_EXPORT HostCache : NON_EXPORTED_BASE(public base::NonThreadSafe) {
private:
FRIEND_TEST_ALL_PREFIXES(HostCacheTest, NoCache);
+ EntryInternal* LookupInternal(const Key& key);
+
// Returns true if this HostCache can contain no entries.
- bool caching_is_disabled() const {
- return entries_.max_entries() == 0;
- }
+ bool caching_is_disabled() const { return max_entries_ == 0; }
+
+ void EvictOneEntry(base::TimeTicks now);
// Map from hostname (presumably in lowercase canonicalized format) to
// a resolved result entry.
EntryMap entries_;
+ size_t max_entries_;
+ int network_changes_;
DISALLOW_COPY_AND_ASSIGN(HostCache);
};
« no previous file with comments | « net/dns/dns_util.cc ('k') | net/dns/host_cache.cc » ('j') | net/dns/host_cache.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698