summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorttuttle@chromium.org <ttuttle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-31 22:46:24 +0000
committerttuttle@chromium.org <ttuttle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-31 22:46:24 +0000
commit4e314a9f15c1f439fae50edeb08dfa45766613b2 (patch)
tree11090eb10be77c3fb84080de436b00400383f279
parentabb8a16efe84999c5c94a10c5a2f6ac98e794ccb (diff)
downloadchromium_src-4e314a9f15c1f439fae50edeb08dfa45766613b2.zip
chromium_src-4e314a9f15c1f439fae50edeb08dfa45766613b2.tar.gz
chromium_src-4e314a9f15c1f439fae50edeb08dfa45766613b2.tar.bz2
HttpAuthCache: add eviction histograms.
Add histograms to measure how often realms and paths are evicted from the HTTP auth cache, along with the time since creation and last use for evicted realms. BUG=354187 TEST=HttpAuthCacheTest.* in net_unittests still passes Review URL: https://codereview.chromium.org/205673003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260685 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--net/http/http_auth_cache.cc41
-rw-r--r--net/http/http_auth_cache.h6
-rw-r--r--tools/metrics/histograms/histograms.xml45
3 files changed, 90 insertions, 2 deletions
diff --git a/net/http/http_auth_cache.cc b/net/http/http_auth_cache.cc
index 63bad07..d989830 100644
--- a/net/http/http_auth_cache.cc
+++ b/net/http/http_auth_cache.cc
@@ -5,6 +5,7 @@
#include "net/http/http_auth_cache.h"
#include "base/logging.h"
+#include "base/metrics/histogram.h"
#include "base/strings/string_util.h"
namespace {
@@ -57,6 +58,14 @@ struct IsEnclosedBy {
const std::string& path;
};
+void RecordLookupPosition(int position) {
+ UMA_HISTOGRAM_COUNTS_100("Net.HttpAuthCacheLookupPosition", position);
+}
+
+void RecordLookupByPathPosition(int position) {
+ UMA_HISTOGRAM_COUNTS_100("Net.HttpAuthCacheLookupByPathPosition", position);
+}
+
} // namespace
namespace net {
@@ -73,12 +82,18 @@ HttpAuthCache::Entry* HttpAuthCache::Lookup(const GURL& origin,
HttpAuth::Scheme scheme) {
CheckOriginIsValid(origin);
+ int entries_examined = 0;
// Linear scan through the realm entries.
for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
+ ++entries_examined;
if (it->origin() == origin && it->realm() == realm &&
- it->scheme() == scheme)
+ it->scheme() == scheme) {
+ it->last_use_time_ = base::TimeTicks::Now();
+ RecordLookupPosition(entries_examined);
return &(*it);
+ }
}
+ RecordLookupPosition(0);
return NULL; // No realm entry found.
}
@@ -89,6 +104,7 @@ HttpAuthCache::Entry* HttpAuthCache::LookupByPath(const GURL& origin,
const std::string& path) {
HttpAuthCache::Entry* best_match = NULL;
size_t best_match_length = 0;
+ int best_match_position = 0;
CheckOriginIsValid(origin);
CheckPathIsValid(path);
@@ -98,15 +114,21 @@ HttpAuthCache::Entry* HttpAuthCache::LookupByPath(const GURL& origin,
// within the protection space ...
std::string parent_dir = GetParentDirectory(path);
+ int entries_examined = 0;
// Linear scan through the realm entries.
for (EntryList::iterator it = entries_.begin(); it != entries_.end(); ++it) {
+ ++entries_examined;
size_t len = 0;
if (it->origin() == origin && it->HasEnclosingPath(parent_dir, &len) &&
(!best_match || len > best_match_length)) {
- best_match_length = len;
best_match = &(*it);
+ best_match_length = len;
+ best_match_position = entries_examined;
}
}
+ if (best_match)
+ best_match->last_use_time_ = base::TimeTicks::Now();
+ RecordLookupByPathPosition(best_match_position);
return best_match;
}
@@ -119,20 +141,30 @@ HttpAuthCache::Entry* HttpAuthCache::Add(const GURL& origin,
CheckOriginIsValid(origin);
CheckPathIsValid(path);
+ base::TimeTicks now = base::TimeTicks::Now();
+
// Check for existing entry (we will re-use it if present).
HttpAuthCache::Entry* entry = Lookup(origin, realm, scheme);
if (!entry) {
+ bool evicted = false;
// Failsafe to prevent unbounded memory growth of the cache.
if (entries_.size() >= kMaxNumRealmEntries) {
LOG(WARNING) << "Num auth cache entries reached limit -- evicting";
+ UMA_HISTOGRAM_LONG_TIMES("Net.HttpAuthCacheAddEvictedCreation",
+ now - entries_.back().creation_time_);
+ UMA_HISTOGRAM_LONG_TIMES("Net.HttpAuthCacheAddEvictedLastUse",
+ now - entries_.back().last_use_time_);
entries_.pop_back();
+ evicted = true;
}
+ UMA_HISTOGRAM_BOOLEAN("Net.HttpAuthCacheAddEvicted", evicted);
entries_.push_front(Entry());
entry = &entries_.front();
entry->origin_ = origin;
entry->realm_ = realm;
entry->scheme_ = scheme;
+ entry->creation_time_ = now;
}
DCHECK_EQ(origin, entry->origin_);
DCHECK_EQ(realm, entry->realm_);
@@ -142,6 +174,7 @@ HttpAuthCache::Entry* HttpAuthCache::Add(const GURL& origin,
entry->credentials_ = credentials;
entry->nonce_count_ = 1;
entry->AddPath(path);
+ entry->last_use_time_ = now;
return entry;
}
@@ -166,12 +199,15 @@ void HttpAuthCache::Entry::AddPath(const std::string& path) {
// Remove any entries that have been subsumed by the new entry.
paths_.remove_if(IsEnclosedBy(parent_dir));
+ bool evicted = false;
// Failsafe to prevent unbounded memory growth of the cache.
if (paths_.size() >= kMaxNumPathsPerRealmEntry) {
LOG(WARNING) << "Num path entries for " << origin()
<< " has grown too large -- evicting";
paths_.pop_back();
+ evicted = true;
}
+ UMA_HISTOGRAM_BOOLEAN("Net.HttpAuthCacheAddPathEvicted", evicted);
// Add new path.
paths_.push_front(parent_dir);
@@ -221,6 +257,7 @@ bool HttpAuthCache::UpdateStaleChallenge(const GURL& origin,
if (!entry)
return false;
entry->UpdateStaleChallenge(auth_challenge);
+ entry->last_use_time_ = base::TimeTicks::Now();
return true;
}
diff --git a/net/http/http_auth_cache.h b/net/http/http_auth_cache.h
index 75b379f..707a571 100644
--- a/net/http/http_auth_cache.h
+++ b/net/http/http_auth_cache.h
@@ -10,6 +10,7 @@
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/http/http_auth.h"
#include "url/gurl.h"
@@ -96,6 +97,11 @@ class NET_EXPORT_PRIVATE HttpAuthCache {
// List of paths that define the realm's protection space.
PathList paths_;
+
+ // Times the entry was created and last used (by looking up, adding a path,
+ // or updating the challenge.)
+ base::TimeTicks creation_time_;
+ base::TimeTicks last_use_time_;
};
// Prevent unbounded memory growth. These are safeguards for abuse; it is
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index d968e9f..444e448 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -11642,6 +11642,51 @@ other types of suffix sets.
</summary>
</histogram>
+<histogram name="Net.HttpAuthCacheAddEvicted">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ Whether adding an entry to the HTTP auth cache evicted another entry.
+ </summary>
+</histogram>
+
+<histogram name="Net.HttpAuthCacheAddEvictedCreation">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ When an HTTP auth cache entry is evicted, the time since it was created.
+ </summary>
+</histogram>
+
+<histogram name="Net.HttpAuthCacheAddEvictedLastUse">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ When an HTTP auth cache entry is evicted, the time since it was last used.
+ </summary>
+</histogram>
+
+<histogram name="Net.HttpAuthCacheAddPathEvicted">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ Whether adding a path to an entry in the HTTP auth cache evicted another
+ path.
+ </summary>
+</histogram>
+
+<histogram name="Net.HttpAuthCacheLookupByPathPosition">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ When looking up an HTTP auth cache entry by path, the position (1-indexed)
+ of the entry on a hit, or 0 on a miss.
+ </summary>
+</histogram>
+
+<histogram name="Net.HttpAuthCacheLookupPosition">
+ <owner>ttuttle@chromium.org</owner>
+ <summary>
+ When looking up an HTTP auth cache entry by realm, the position (1-indexed)
+ of the entry on a hit, or 0 on a miss.
+ </summary>
+</histogram>
+
<histogram name="Net.HttpAuthCount" enum="HttpAuthCount">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<summary>