diff --git a/monitoring/histogram.cc b/monitoring/histogram.cc index 323a08efb..331796e5b 100644 --- a/monitoring/histogram.cc +++ b/monitoring/histogram.cc @@ -164,15 +164,16 @@ double HistogramStat::Average() const { } double HistogramStat::StandardDeviation() const { - uint64_t cur_num = num(); - uint64_t cur_sum = sum(); - uint64_t cur_sum_squares = sum_squares(); + double cur_num = + static_cast(num()); // Use double to avoid integer overflow + double cur_sum = static_cast(sum()); + double cur_sum_squares = static_cast(sum_squares()); if (cur_num == 0) return 0; double variance = - static_cast(cur_sum_squares * cur_num - cur_sum * cur_sum) / - static_cast(cur_num * cur_num); + (cur_sum_squares * cur_num - cur_sum * cur_sum) / (cur_num * cur_num); return std::sqrt(variance); } + std::string HistogramStat::ToString() const { uint64_t cur_num = num(); std::string r; diff --git a/monitoring/histogram_test.cc b/monitoring/histogram_test.cc index a37289365..7b63dc93a 100644 --- a/monitoring/histogram_test.cc +++ b/monitoring/histogram_test.cc @@ -225,6 +225,12 @@ TEST_F(HistogramTest, HistogramWindowingMerge) { ASSERT_EQ(histogramWindowing.max(), 5); } +TEST_F(HistogramTest, LargeStandardDeviation) { + HistogramImpl histogram; + PopulateHistogram(histogram, 1, 1000000); + ASSERT_LT(fabs(histogram.StandardDeviation() - 288675), 1); +} + } // namespace ROCKSDB_NAMESPACE int main(int argc, char** argv) {