This is an automated email from the ASF dual-hosted git repository.

mochen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 36da45475d Fix an infinite loop in Histogram (#11752)
36da45475d is described below

commit 36da45475db02790b95d615a690b91170aa2f06c
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.
---
 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);

Reply via email to