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

Unified Diff: net/dns/host_cache.cc

Issue 2943143002: Add PersistenceDelegate to HostCache (Closed)
Patch Set: comments Created 3 years, 6 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
« no previous file with comments | « net/dns/host_cache.h ('k') | net/dns/host_cache_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/dns/host_cache.cc
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc
index 999d3f6b221876080b33966ced906c5af1c0d9c3..19a2192698fb8f85b70ad92212c4e4acc0719696 100644
--- a/net/dns/host_cache.cc
+++ b/net/dns/host_cache.cc
@@ -145,7 +145,7 @@ void HostCache::Entry::GetStaleness(base::TimeTicks now,
}
HostCache::HostCache(size_t max_entries)
- : max_entries_(max_entries), network_changes_(0) {}
+ : max_entries_(max_entries), network_changes_(0), delegate_(nullptr) {}
HostCache::~HostCache() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -210,21 +210,31 @@ void HostCache::Set(const Key& key,
if (caching_is_disabled())
return;
+ bool result_changed = false;
auto it = entries_.find(key);
if (it != entries_.end()) {
bool is_stale = it->second.IsStale(now, network_changes_);
+ AddressListDeltaType delta =
+ FindAddressListDeltaType(it->second.addresses(), entry.addresses());
RecordSet(is_stale ? SET_UPDATE_STALE : SET_UPDATE_VALID, now, &it->second,
- entry);
+ entry, delta);
// TODO(juliatuttle): Remember some old metadata (hit count or frequency or
// something like that) if it's useful for better eviction algorithms?
+ result_changed =
+ entry.error() == OK &&
+ (it->second.error() != entry.error() || delta != DELTA_IDENTICAL);
entries_.erase(it);
} else {
+ result_changed = true;
if (size() == max_entries_)
EvictOneEntry(now);
- RecordSet(SET_INSERT, now, nullptr, entry);
+ RecordSet(SET_INSERT, now, nullptr, entry, DELTA_DISJOINT);
}
AddEntry(Key(key), Entry(entry, now, ttl, network_changes_));
+
+ if (delegate_ && result_changed)
+ delegate_->ScheduleWrite();
}
void HostCache::AddEntry(const Key& key, const Entry& entry) {
@@ -241,7 +251,14 @@ void HostCache::OnNetworkChange() {
void HostCache::clear() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
RecordEraseAll(ERASE_CLEAR, base::TimeTicks::Now());
+
+ // Don't bother scheduling a write if there's nothing to clear.
+ if (size() == 0)
+ return;
+
entries_.clear();
+ if (delegate_)
+ delegate_->ScheduleWrite();
}
void HostCache::ClearForHosts(
@@ -253,6 +270,7 @@ void HostCache::ClearForHosts(
return;
}
+ bool changed = false;
base::TimeTicks now = base::TimeTicks::Now();
for (EntryMap::iterator it = entries_.begin(); it != entries_.end();) {
EntryMap::iterator next_it = std::next(it);
@@ -260,10 +278,14 @@ void HostCache::ClearForHosts(
if (host_filter.Run(it->first.hostname)) {
RecordErase(ERASE_CLEAR, now, it->second);
entries_.erase(it);
+ changed = true;
}
it = next_it;
}
+
+ if (delegate_ && changed)
+ delegate_->ScheduleWrite();
}
std::unique_ptr<base::ListValue> HostCache::GetAsListValue(
@@ -417,7 +439,8 @@ void HostCache::EvictOneEntry(base::TimeTicks now) {
void HostCache::RecordSet(SetOutcome outcome,
base::TimeTicks now,
const Entry* old_entry,
- const Entry& new_entry) {
+ const Entry& new_entry,
+ AddressListDeltaType delta) {
CACHE_HISTOGRAM_ENUM("Set", outcome, MAX_SET_OUTCOME);
switch (outcome) {
case SET_INSERT:
@@ -432,8 +455,6 @@ void HostCache::RecordSet(SetOutcome outcome,
stale.network_changes);
CACHE_HISTOGRAM_COUNT("UpdateStale.StaleHits", stale.stale_hits);
if (old_entry->error() == OK && new_entry.error() == OK) {
- AddressListDeltaType delta = FindAddressListDeltaType(
- old_entry->addresses(), new_entry.addresses());
RecordUpdateStale(delta, stale);
}
break;
« no previous file with comments | « net/dns/host_cache.h ('k') | net/dns/host_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698