This is an automated email from the ASF dual-hosted git repository. cmcfarlen pushed a commit to branch 10.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 63bb35dfa7926f468f66e0f2279dd5b529a18a84 Author: Mo Chen <[email protected]> AuthorDate: Fri Aug 30 14:12:00 2024 -0500 Fix an infinite loop in Histogram (#11752) The loop in Histogram::operator() is infinite if R = 7, S = 2, and sample = 512. When this happens, the histogram will not find a matching bit and will loop forever with mask at 0. This change lowers OVERFLOW_BOUND so that every sample is guaranteed to have a 1-bit within the range of histogram buckets. (cherry picked from commit 36da45475db02790b95d615a690b91170aa2f06c) --- include/tsutil/Histogram.h | 2 +- src/tscore/unit_tests/test_Histogram.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/tsutil/Histogram.h b/include/tsutil/Histogram.h index 1bcdd38a21..f5c0c679e9 100644 --- a/include/tsutil/Histogram.h +++ b/include/tsutil/Histogram.h @@ -75,7 +75,7 @@ public: /// Samples less than this go in the underflow range. static constexpr raw_type UNDERFLOW_BOUND = static_cast<raw_type>(1) << N_SPAN_BITS; /// Sample equal or greater than this go in the overflow bucket. - static constexpr raw_type OVERFLOW_BOUND = static_cast<raw_type>(1) << (N_RANGE_BITS + N_SPAN_BITS + 1); + static constexpr raw_type OVERFLOW_BOUND = static_cast<raw_type>(1) << (N_RANGE_BITS + N_SPAN_BITS); /** Add @sample to the histogram. * diff --git a/src/tscore/unit_tests/test_Histogram.cc b/src/tscore/unit_tests/test_Histogram.cc index 54941540d2..9d9382f35e 100644 --- a/src/tscore/unit_tests/test_Histogram.cc +++ b/src/tscore/unit_tests/test_Histogram.cc @@ -45,7 +45,7 @@ TEST_CASE("Histogram Basic", "[libts][histogram]") REQUIRE(h.min_for_bucket(16) == 32); REQUIRE(h.min_for_bucket(17) == 40); - for (auto x : {0, 1, 4, 6, 19, 27, 36, 409, 16000, 1097}) { + for (auto x : {0, 1, 4, 6, 19, 27, 36, 409, 16000, 1097, 512}) { h(x); } REQUIRE(h[0] == 1);
