fix inclusive-exclusiveness of histogram ToString

Summary:
I spent too much time thinking about histograms lately and realized boundary values fall into the lower bucket, not the upper bucket. It's because we're using `std::map::lower_bound` here: 867fe92e5e/monitoring/histogram.cc (L53).  Fixed histogram's `ToString()` to reflect this.
Closes https://github.com/facebook/rocksdb/pull/2817

Differential Revision: D5751159

Pulled By: ajkr

fbshipit-source-id: 67432bb45849eec9b5bcc0d095551dbc0ee81766
This commit is contained in:
Andrew Kryczka 2017-09-01 10:46:26 -07:00 committed by Facebook Github Bot
parent 0ec90a7cc2
commit 3b9a000c15
2 changed files with 15 additions and 1 deletions

View File

@ -209,7 +209,8 @@ std::string HistogramStat::ToString() const {
if (bucket_value <= 0.0) continue;
cumulative_sum += bucket_value;
snprintf(buf, sizeof(buf),
"[ %7" PRIu64 ", %7" PRIu64 " ) %8" PRIu64 " %7.3f%% %7.3f%% ",
"%c %7" PRIu64 ", %7" PRIu64 " ] %8" PRIu64 " %7.3f%% %7.3f%% ",
(b == 0) ? '[' : '(',
(b == 0) ? 0 : bucketMapper.BucketLimit(b-1), // left
bucketMapper.BucketLimit(b), // right
bucket_value, // count

View File

@ -85,6 +85,19 @@ TEST_F(HistogramTest, BasicOperation) {
BasicOperation(histogramWindowing);
}
TEST_F(HistogramTest, BoundaryValue) {
HistogramImpl histogram;
// - both should be in [0, 1] bucket because we place values on bucket
// boundaries in the lower bucket.
// - all points are in [0, 1] bucket, so p50 will be 0.5
// - the test cannot be written with a single point since histogram won't
// report percentiles lower than the min or greater than the max.
histogram.Add(0);
histogram.Add(1);
ASSERT_LE(fabs(histogram.Percentile(50.0) - 0.5), kIota);
}
TEST_F(HistogramTest, MergeHistogram) {
HistogramImpl histogram;
HistogramImpl other;