Index: base/metrics/histogram.cc |
=================================================================== |
--- base/metrics/histogram.cc (revision 64845) |
+++ base/metrics/histogram.cc (working copy) |
@@ -61,7 +61,6 @@ |
bucket_count_(bucket_count), |
flags_(kNoFlags), |
ranges_(bucket_count + 1, 0), |
- range_checksum_(0), |
sample_() { |
Initialize(); |
} |
@@ -74,7 +73,6 @@ |
bucket_count_(bucket_count), |
flags_(kNoFlags), |
ranges_(bucket_count + 1, 0), |
- range_checksum_(0), |
sample_() { |
Initialize(); |
} |
@@ -88,7 +86,6 @@ |
// Just to make sure most derived class did this properly... |
DCHECK(ValidateBucketRanges()); |
- DCHECK(HasValidRangeChecksum()); |
} |
bool Histogram::PrintEmptyBucket(size_t index) const { |
@@ -221,7 +218,7 @@ |
// We have to be careful that we don't pick a ratio between starting points in |
// consecutive buckets that is sooo small, that the integer bounds are the same |
// (effectively making one bucket get no values). We need to avoid: |
-// ranges_[i] == ranges_[i + 1] |
+// (ranges_[i] == ranges_[i + 1] |
// To avoid that, we just do a fine-grained bucket width as far as we need to |
// until we get a ratio that moves us along at least 2 units at a time. From |
// that bucket onward we do use the exponential growth of buckets. |
@@ -247,7 +244,6 @@ |
++current; // Just do a narrow bucket, and keep trying. |
SetBucketRange(bucket_index, current); |
} |
- ResetRangeChecksum(); |
DCHECK_EQ(bucket_count(), bucket_index); |
} |
@@ -291,23 +287,6 @@ |
return current/denominator; |
} |
-void Histogram::ResetRangeChecksum() { |
- range_checksum_ = CalculateRangeChecksum(); |
-} |
- |
-bool Histogram::HasValidRangeChecksum() const { |
- return CalculateRangeChecksum() == range_checksum_; |
-} |
- |
-Histogram::Sample Histogram::CalculateRangeChecksum() const { |
- DCHECK_EQ(ranges_.size(), bucket_count() + 1); |
- Sample checksum = 0; |
- for (size_t index = 0; index < bucket_count(); ++index) { |
- checksum += ranges(index); |
- } |
- return checksum; |
-} |
- |
//------------------------------------------------------------------------------ |
// The following two methods can be overridden to provide a thread safe |
// version of this class. The cost of locking is low... but an error in each |
@@ -438,7 +417,6 @@ |
pickle.WriteInt(histogram.declared_min()); |
pickle.WriteInt(histogram.declared_max()); |
pickle.WriteSize(histogram.bucket_count()); |
- pickle.WriteInt(histogram.range_checksum()); |
pickle.WriteInt(histogram.histogram_type()); |
pickle.WriteInt(histogram.flags()); |
@@ -454,21 +432,19 @@ |
Pickle pickle(histogram_info.data(), |
static_cast<int>(histogram_info.size())); |
- std::string histogram_name; |
+ void* iter = NULL; |
+ size_t bucket_count; |
int declared_min; |
int declared_max; |
- size_t bucket_count; |
- int range_checksum; |
int histogram_type; |
int pickle_flags; |
+ std::string histogram_name; |
SampleSet sample; |
- void* iter = NULL; |
if (!pickle.ReadString(&iter, &histogram_name) || |
!pickle.ReadInt(&iter, &declared_min) || |
!pickle.ReadInt(&iter, &declared_max) || |
!pickle.ReadSize(&iter, &bucket_count) || |
- !pickle.ReadInt(&iter, &range_checksum) || |
!pickle.ReadInt(&iter, &histogram_type) || |
!pickle.ReadInt(&iter, &pickle_flags) || |
!sample.Histogram::SampleSet::Deserialize(&iter, pickle)) { |
@@ -507,7 +483,6 @@ |
DCHECK_EQ(render_histogram->declared_min(), declared_min); |
DCHECK_EQ(render_histogram->declared_max(), declared_max); |
DCHECK_EQ(render_histogram->bucket_count(), bucket_count); |
- DCHECK_EQ(render_histogram->range_checksum(), range_checksum); |
DCHECK_EQ(render_histogram->histogram_type(), histogram_type); |
if (render_histogram->flags() & kIPCSerializationSourceFlag) { |
@@ -522,64 +497,13 @@ |
} |
//------------------------------------------------------------------------------ |
-// Methods for the validating a sample and a related histogram. |
-//------------------------------------------------------------------------------ |
- |
-Histogram::Inconsistencies Histogram::FindCorruption( |
- const SampleSet& snapshot) const { |
- int inconsistencies = NO_INCONSISTENCIES; |
- Sample previous_range = -1; // Bottom range is always 0. |
- Sample checksum = 0; |
- int64 count = 0; |
- for (size_t index = 0; index < bucket_count(); ++index) { |
- count += snapshot.counts(index); |
- int new_range = ranges(index); |
- checksum += new_range; |
- if (previous_range >= new_range) |
- inconsistencies |= BUCKET_ORDER_ERROR; |
- previous_range = new_range; |
- } |
- |
- if (checksum != range_checksum_) |
- inconsistencies |= RANGE_CHECKSUM_ERROR; |
- |
- int64 delta64 = snapshot.redundant_count() - count; |
- if (delta64 != 0) { |
- int delta = static_cast<int>(delta64); |
- if (delta != delta64) |
- delta = INT_MAX; // Flag all giant errors as INT_MAX. |
- // Since snapshots of histograms are taken asynchronously relative to |
- // sampling (and snapped from different threads), it is pretty likely that |
- // we'll catch a redundant count that doesn't match the sample count. We |
- // allow for a certain amount of slop before flagging this as an |
- // inconsistency. Even with an inconsistency, we'll snapshot it again (for |
- // UMA in about a half hour, so we'll eventually get the data, if it was |
- // not the result of a corruption. If histograms show that 1 is "too tight" |
- // then we may try to use 2 or 3 for this slop value. |
- const int kCommonRaceBasedCountMismatch = 1; |
- if (delta > 0) { |
- UMA_HISTOGRAM_COUNTS("Histogram.InconsistentCountHigh", delta); |
- if (delta > kCommonRaceBasedCountMismatch) |
- inconsistencies |= COUNT_HIGH_ERROR; |
- } else { |
- DCHECK_GT(0, delta); |
- UMA_HISTOGRAM_COUNTS("Histogram.InconsistentCountLow", -delta); |
- if (-delta > kCommonRaceBasedCountMismatch) |
- inconsistencies |= COUNT_LOW_ERROR; |
- } |
- } |
- return static_cast<Inconsistencies>(inconsistencies); |
-} |
- |
-//------------------------------------------------------------------------------ |
// Methods for the Histogram::SampleSet class |
//------------------------------------------------------------------------------ |
Histogram::SampleSet::SampleSet() |
: counts_(), |
sum_(0), |
- square_sum_(0), |
- redundant_count_(0) { |
+ square_sum_(0) { |
} |
Histogram::SampleSet::~SampleSet() { |
@@ -600,11 +524,9 @@ |
counts_[index] += count; |
sum_ += count * value; |
square_sum_ += (count * value) * static_cast<int64>(value); |
- redundant_count_ += count; |
DCHECK_GE(counts_[index], 0); |
DCHECK_GE(sum_, 0); |
DCHECK_GE(square_sum_, 0); |
- DCHECK_GE(redundant_count_, 0); |
} |
Count Histogram::SampleSet::TotalCount() const { |
@@ -614,7 +536,6 @@ |
++it) { |
total += *it; |
} |
- DCHECK_EQ(total, redundant_count_); |
return total; |
} |
@@ -622,7 +543,6 @@ |
DCHECK_EQ(counts_.size(), other.counts_.size()); |
sum_ += other.sum_; |
square_sum_ += other.square_sum_; |
- redundant_count_ += other.redundant_count_; |
for (size_t index = 0; index < counts_.size(); ++index) |
counts_[index] += other.counts_[index]; |
} |
@@ -634,7 +554,6 @@ |
// calculated). As a result, we don't currently CHCEK() for positive values. |
sum_ -= other.sum_; |
square_sum_ -= other.square_sum_; |
- redundant_count_ -= other.redundant_count_; |
for (size_t index = 0; index < counts_.size(); ++index) { |
counts_[index] -= other.counts_[index]; |
DCHECK_GE(counts_[index], 0); |
@@ -644,7 +563,6 @@ |
bool Histogram::SampleSet::Serialize(Pickle* pickle) const { |
pickle->WriteInt64(sum_); |
pickle->WriteInt64(square_sum_); |
- pickle->WriteInt64(redundant_count_); |
pickle->WriteSize(counts_.size()); |
for (size_t index = 0; index < counts_.size(); ++index) { |
@@ -658,13 +576,11 @@ |
DCHECK_EQ(counts_.size(), 0u); |
DCHECK_EQ(sum_, 0); |
DCHECK_EQ(square_sum_, 0); |
- DCHECK_EQ(redundant_count_, 0); |
size_t counts_size; |
if (!pickle.ReadInt64(iter, &sum_) || |
!pickle.ReadInt64(iter, &square_sum_) || |
- !pickle.ReadInt64(iter, &redundant_count_) || |
!pickle.ReadSize(iter, &counts_size)) { |
return false; |
} |
@@ -672,16 +588,14 @@ |
if (counts_size == 0) |
return false; |
- int count = 0; |
for (size_t index = 0; index < counts_size; ++index) { |
int i; |
if (!pickle.ReadInt(iter, &i)) |
return false; |
counts_.push_back(i); |
- count += i; |
} |
- DCHECK_EQ(count, redundant_count_); |
- return count == redundant_count_; |
+ |
+ return true; |
} |
//------------------------------------------------------------------------------ |
@@ -780,7 +694,6 @@ |
(bucket_count() - 2); |
SetBucketRange(i, static_cast<int> (linear_range + 0.5)); |
} |
- ResetRangeChecksum(); |
} |
double LinearHistogram::GetBucketSize(Count current, size_t i) const { |
@@ -827,7 +740,7 @@ |
scoped_refptr<Histogram> CustomHistogram::FactoryGet( |
const std::string& name, |
- const std::vector<Sample>& custom_ranges, |
+ const std::vector<int>& custom_ranges, |
Flags flags) { |
scoped_refptr<Histogram> histogram(NULL); |
@@ -861,7 +774,7 @@ |
} |
CustomHistogram::CustomHistogram(const std::string& name, |
- const std::vector<Sample>& custom_ranges) |
+ const std::vector<int>& custom_ranges) |
: Histogram(name, custom_ranges[1], custom_ranges.back(), |
custom_ranges.size()) { |
DCHECK_GT(custom_ranges.size(), 1u); |
@@ -876,7 +789,6 @@ |
DCHECK_LE(ranges_vector_->size(), bucket_count()); |
for (size_t index = 0; index < ranges_vector_->size(); ++index) |
SetBucketRange(index, (*ranges_vector_)[index]); |
- ResetRangeChecksum(); |
} |
double CustomHistogram::GetBucketSize(Count current, size_t i) const { |