Index: components/precache/core/precache_database.cc |
diff --git a/components/precache/core/precache_database.cc b/components/precache/core/precache_database.cc |
index e9d53ecad16d8bc30ebd4415013430d1bd131dda..269eded59dc1da3031a31610d56265cfe8372458 100644 |
--- a/components/precache/core/precache_database.cc |
+++ b/components/precache/core/precache_database.cc |
@@ -23,6 +23,9 @@ namespace { |
// it is considered "old" and is removed from the table. |
const int kPrecacheHistoryExpiryPeriodDays = 60; |
+const int kSecondsInMinute = 60; |
+const int kSecondsInHour = kSecondsInMinute * 60; |
+ |
} // namespace |
namespace precache { |
@@ -90,6 +93,28 @@ void PrecacheDatabase::ClearHistory() { |
Flush(); |
} |
+void PrecacheDatabase::SetLastPrecacheTimestamp(const base::Time& time) { |
+ last_precache_timestamp_ = time; |
+ |
+ if (!IsDatabaseAccessible()) { |
+ // Do nothing if unable to access the database. |
+ return; |
+ } |
+ |
+ buffered_writes_.push_back( |
+ base::Bind(&PrecacheSessionTable::SetLastPrecacheTimestamp, |
+ base::Unretained(&precache_session_table_), time)); |
+ MaybePostFlush(); |
+} |
+ |
+base::Time PrecacheDatabase::GetLastPrecacheTimestamp() { |
+ if (last_precache_timestamp_.is_null() && IsDatabaseAccessible()) { |
+ last_precache_timestamp_ = |
+ precache_session_table_.GetLastPrecacheTimestamp(); |
+ } |
+ return last_precache_timestamp_; |
+} |
+ |
void PrecacheDatabase::RecordURLPrefetch(const GURL& url, |
const base::TimeDelta& latency, |
const base::Time& fetch_time, |
@@ -157,6 +182,8 @@ void PrecacheDatabase::RecordURLNonPrefetch(const GURL& url, |
return; |
} |
+ RecordTimeSinceLastPrecache(fetch_time); |
+ |
if (buffered_urls_.find(url.spec()) != buffered_urls_.end()) { |
// If the URL for this fetch is in the write buffer, then flush the write |
// buffer. |
@@ -201,6 +228,25 @@ void PrecacheDatabase::RecordURLNonPrefetch(const GURL& url, |
MaybePostFlush(); |
} |
+void PrecacheDatabase::RecordTimeSinceLastPrecache( |
+ const base::Time& fetch_time) { |
+ const base::Time& last_precache_timestamp = GetLastPrecacheTimestamp(); |
+ // It could still be null if the DB was not accessible. |
+ if (!last_precache_timestamp.is_null()) { |
+ // This is the timespan (in seconds) between the last call to |
+ // PrecacheManager::StartPrecaching and the fetch time of a non-precache |
+ // URL. Please note that the session started by that call to |
+ // PrecacheManager::StartPrecaching may not have precached this particular |
+ // URL or even any URL for that matter. |
+ // The range was estimated to have the 95 percentile within the last bounded |
+ // bucket. |
+ UMA_HISTOGRAM_CUSTOM_COUNTS( |
+ "Precache.TimeSinceLastPrecache", |
+ (fetch_time - last_precache_timestamp).InSeconds(), kSecondsInMinute, |
+ kSecondsInHour * 36, 100); |
+ } |
+} |
+ |
bool PrecacheDatabase::IsDatabaseAccessible() const { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(db_); |