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

Unified Diff: base/prefs/json_pref_store.cc

Issue 1128733002: Update from https://crrev.com/328418 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 7 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 | « base/prefs/json_pref_store.h ('k') | base/prefs/json_pref_store_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/prefs/json_pref_store.cc
diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc
index 47cd424d9cc9dfa7e8051d13ce72316a6bbd78b9..416e43fce74862df138cf1a671f78dacf946e9de 100644
--- a/base/prefs/json_pref_store.cc
+++ b/base/prefs/json_pref_store.cc
@@ -16,9 +16,11 @@
#include "base/metrics/histogram.h"
#include "base/prefs/pref_filter.h"
#include "base/sequenced_task_runner.h"
+#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/task_runner_util.h"
#include "base/threading/sequenced_worker_pool.h"
+#include "base/time/default_clock.h"
#include "base/values.h"
// Result returned from internal read tasks.
@@ -156,7 +158,8 @@ JsonPrefStore::JsonPrefStore(
pref_filter_(pref_filter.Pass()),
initialized_(false),
filtering_in_progress_(false),
- read_error_(PREF_READ_ERROR_NONE) {
+ read_error_(PREF_READ_ERROR_NONE),
+ write_count_histogram_(writer_.commit_interval(), path_) {
DCHECK(!path_.empty());
}
@@ -174,7 +177,8 @@ JsonPrefStore::JsonPrefStore(
pref_filter_(pref_filter.Pass()),
initialized_(false),
filtering_in_progress_(false),
- read_error_(PREF_READ_ERROR_NONE) {
+ read_error_(PREF_READ_ERROR_NONE),
+ write_count_histogram_(writer_.commit_interval(), path_) {
DCHECK(!path_.empty());
}
@@ -394,6 +398,8 @@ JsonPrefStore::~JsonPrefStore() {
bool JsonPrefStore::SerializeData(std::string* output) {
DCHECK(CalledOnValidThread());
+ write_count_histogram_.RecordWriteOccured();
+
if (pref_filter_)
pref_filter_->FilterSerializeData(prefs_.get());
@@ -435,3 +441,91 @@ void JsonPrefStore::FinalizeFileRead(bool initialization_successful,
return;
}
+
+// NOTE: This value should NOT be changed without renaming the histogram
+// otherwise it will create incompatible buckets.
+const int32_t
+ JsonPrefStore::WriteCountHistogram::kHistogramWriteReportIntervalMins = 5;
+
+JsonPrefStore::WriteCountHistogram::WriteCountHistogram(
+ const base::TimeDelta& commit_interval,
+ const base::FilePath& path)
+ : WriteCountHistogram(commit_interval,
+ path,
+ scoped_ptr<base::Clock>(new base::DefaultClock)) {
+}
+
+JsonPrefStore::WriteCountHistogram::WriteCountHistogram(
+ const base::TimeDelta& commit_interval,
+ const base::FilePath& path,
+ scoped_ptr<base::Clock> clock)
+ : commit_interval_(commit_interval),
+ path_(path),
+ clock_(clock.release()),
+ report_interval_(
+ base::TimeDelta::FromMinutes(kHistogramWriteReportIntervalMins)),
+ last_report_time_(clock_->Now()),
+ writes_since_last_report_(0) {
+}
+
+JsonPrefStore::WriteCountHistogram::~WriteCountHistogram() {
+ ReportOutstandingWrites();
+}
+
+void JsonPrefStore::WriteCountHistogram::RecordWriteOccured() {
+ ReportOutstandingWrites();
+
+ ++writes_since_last_report_;
+}
+
+void JsonPrefStore::WriteCountHistogram::ReportOutstandingWrites() {
+ base::Time current_time = clock_->Now();
+ base::TimeDelta time_since_last_report = current_time - last_report_time_;
+
+ if (time_since_last_report <= report_interval_)
+ return;
+
+ // If the time since the last report exceeds the report interval, report all
+ // the writes since the last report. They must have all occurred in the same
+ // report interval.
+ base::HistogramBase* histogram = GetHistogram();
+ histogram->Add(writes_since_last_report_);
+
+ // There may be several report intervals that elapsed that don't have any
+ // writes in them. Report these too.
+ int64 total_num_intervals_elapsed =
+ (time_since_last_report / report_interval_);
+ for (int64 i = 0; i < total_num_intervals_elapsed - 1; ++i)
+ histogram->Add(0);
+
+ writes_since_last_report_ = 0;
+ last_report_time_ += total_num_intervals_elapsed * report_interval_;
+}
+
+base::HistogramBase* JsonPrefStore::WriteCountHistogram::GetHistogram() {
+ std::string spaceless_basename;
+ base::ReplaceChars(path_.BaseName().MaybeAsASCII(), " ", "_",
+ &spaceless_basename);
+ std::string histogram_name =
+ "Settings.JsonDataWriteCount." + spaceless_basename;
+
+ // The min value for a histogram is 1. The max value is the maximum number of
+ // writes that can occur in the window being recorded. The number of buckets
+ // used is the max value (plus the underflow/overflow buckets).
+ int32_t min_value = 1;
+ int32_t max_value = report_interval_ / commit_interval_;
+ int32_t num_buckets = max_value + 1;
+
+ // NOTE: These values should NOT be changed without renaming the histogram
+ // otherwise it will create incompatible buckets.
+ DCHECK_EQ(30, max_value);
+ DCHECK_EQ(31, num_buckets);
+
+ // The histogram below is an expansion of the UMA_HISTOGRAM_CUSTOM_COUNTS
+ // macro adapted to allow for a dynamically suffixed histogram name.
+ // Note: The factory creates and owns the histogram.
+ base::HistogramBase* histogram = base::Histogram::FactoryGet(
+ histogram_name, min_value, max_value, num_buckets,
+ base::HistogramBase::kUmaTargetedHistogramFlag);
+ return histogram;
+}
« no previous file with comments | « base/prefs/json_pref_store.h ('k') | base/prefs/json_pref_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698