From a61d1560c1a93c333b938ba5c0669e8a2c35c927 Mon Sep 17 00:00:00 2001 From: kruall Date: Tue, 11 Feb 2025 19:33:37 +0300 Subject: [PATCH] Fix underflows in TValueHistory::Accumulate (#14442) --- ydb/library/actors/core/harmonizer/history.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ydb/library/actors/core/harmonizer/history.h b/ydb/library/actors/core/harmonizer/history.h index 889033dc7d84..a1cb3c0ed93e 100644 --- a/ydb/library/actors/core/harmonizer/history.h +++ b/ydb/library/actors/core/harmonizer/history.h @@ -34,6 +34,9 @@ struct TValueHistory { double Accumulate(auto op, auto comb, ui8 seconds) const { HARMONIZER_HISTORY_PRINT("Accumulate, seconds = ", static_cast(seconds), ", WithTail = ", WithTail); double acc = AccumulatedValue; + if (seconds == 0) { + return acc; + } size_t idx = HistoryIdx; ui8 leftSeconds = seconds; if constexpr (!WithTail) { @@ -46,10 +49,11 @@ struct TValueHistory { } HARMONIZER_HISTORY_PRINT("Accumulate iteration, acc = ", acc, ", idx = ", static_cast(idx), ", leftSeconds = ", static_cast(leftSeconds)); while (leftSeconds) { - idx--; leftSeconds--; - if (idx >= HistoryBufferSize) { + if (idx == 0) { idx = HistoryBufferSize - 1; + } else { + idx--; } if constexpr (!WithTail) { acc = op(acc, History[idx]);