summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/renderer_histogram_snapshots.cc
diff options
context:
space:
mode:
authorjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-01 23:40:51 +0000
committerjar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-01 23:40:51 +0000
commit022001851f2f6be890f9b44c49fa45ea38fa80b2 (patch)
tree9ea0cc9ac76b7002421110a5dee0ae60082740aa /chrome/renderer/renderer_histogram_snapshots.cc
parentada794814ca34a4761b21b1c2562cc75de22ff52 (diff)
downloadchromium_src-022001851f2f6be890f9b44c49fa45ea38fa80b2.zip
chromium_src-022001851f2f6be890f9b44c49fa45ea38fa80b2.tar.gz
chromium_src-022001851f2f6be890f9b44c49fa45ea38fa80b2.tar.bz2
Try to detect internal corruption of histogram instances.
Corruptions can include changes in bucket boundaries, large changes in sample counts (in a bucket), etc. We now detect problems, and don't forward the corrupt data any further. This means it won't exit the renderer and go to the browser if corrupt, and it won't exit the browser and be sent up via UMA if corrupt. IF the would-be corruption is caused by a race to snapshot the data, then a later snapshot should get the clean copy, and all data (across the precluded period) will be sent onward. BUG=61281 r=mbelshe Review URL: http://codereview.chromium.org/4174002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@64687 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/renderer_histogram_snapshots.cc')
-rw-r--r--chrome/renderer/renderer_histogram_snapshots.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/chrome/renderer/renderer_histogram_snapshots.cc b/chrome/renderer/renderer_histogram_snapshots.cc
index ae9ee1d..6124e04 100644
--- a/chrome/renderer/renderer_histogram_snapshots.cc
+++ b/chrome/renderer/renderer_histogram_snapshots.cc
@@ -52,17 +52,33 @@ void RendererHistogramSnapshots::UploadAllHistrograms(int sequence_number) {
sequence_number, pickled_histograms));
}
-// Extract snapshot data and then send it off the the Browser process
-// to save it.
+// Extract snapshot data, remember what we've seen so far, and then send off the
+// delta to the browser.
void RendererHistogramSnapshots::UploadHistrogram(
const Histogram& histogram,
HistogramPickledList* pickled_histograms) {
-
// Get up-to-date snapshot of sample stats.
Histogram::SampleSet snapshot;
histogram.SnapshotSample(&snapshot);
const std::string& histogram_name = histogram.histogram_name();
+ int corruption = histogram.FindCorruption(snapshot);
+ if (corruption) {
+ NOTREACHED();
+ // Don't send corrupt data to the browser.
+ UMA_HISTOGRAM_ENUMERATION("Histogram.InconsistenciesRenderer",
+ corruption, Histogram::NEVER_EXCEEDED_VALUE);
+ typedef std::map<std::string, int> ProblemMap;
+ static ProblemMap* inconsistencies = new ProblemMap;
+ int old_corruption = (*inconsistencies)[histogram_name];
+ if (old_corruption == (corruption | old_corruption))
+ return; // We've already seen this corruption for this histogram.
+ (*inconsistencies)[histogram_name] |= corruption;
+ UMA_HISTOGRAM_ENUMERATION("Histogram.InconsistenciesRendererUnique",
+ corruption, Histogram::NEVER_EXCEEDED_VALUE);
+ return;
+ }
+
// Find the already sent stats, or create an empty set.
LoggedSampleMap::iterator it = logged_samples_.find(histogram_name);
Histogram::SampleSet* already_logged;
@@ -89,7 +105,6 @@ void RendererHistogramSnapshots::UploadHistogramDelta(
const Histogram& histogram,
const Histogram::SampleSet& snapshot,
HistogramPickledList* pickled_histograms) {
-
DCHECK(0 != snapshot.TotalCount());
snapshot.CheckSize(histogram);