apache/cassandra · error · IllegalStateException

EstimatedHistogram overflow

Error message

EstimatedHistogram overflow: [{}]

What it means

DecayingEstimatedHistogramReservoir.getValue logs this when the overflow bucket (last bucket) is non-zero: recorded latencies exceeded the histogram's largest representable bucket, so the quantile estimate at the requested point is a lower bound and unreliable. Accompanied by an IllegalStateException per the javadoc.

Solutions

  1. Treat returned quantile values as lower bounds when this appears.
  2. Investigate what produced latencies beyond the histogram range (e.g. GC pauses, stalled nodes).
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java:512 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/4ef438c7059a3957. Report an issue: GitHub.

Appendix: source

Thrown at src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java:512

        /**
         * Get the estimated value at the specified quantile in the distribution.
         *
         * @param quantile the quantile specified as a value between 0.0 (zero) and 1.0 (one)
         * @return estimated value at given quantile
         * @throws IllegalStateException in case the histogram overflowed
         */
        @Override
        public double getValue(double quantile)
        {
            assert quantile >= 0 && quantile <= 1.0;

            final int lastBucket = decayingBuckets.length - 1;

            if (decayingBuckets[lastBucket] > 0)
            {
                try { throw new IllegalStateException("EstimatedHistogram overflow: " + Arrays.toString(decayingBuckets)); }
                catch (IllegalStateException e) { noSpamLogger.warn("", e); }
            }

            final long qcount = (long) Math.ceil(count() * quantile);
            if (qcount == 0)
                return 0;

            long elements = 0;
            for (int i = 0; i < lastBucket; i++)
            {
                elements += decayingBuckets[i];
                if (elements >= qcount)
                    return bucketOffsets[i];
            }
            return 0;
        }

        /**
         * Return the number of registered values taking forward decay into account.

View on GitHub (pinned to 88fd0f6a0e)