From 74ff555111120502a9f8aa1e29ba81e43b94f53b Mon Sep 17 00:00:00 2001 From: Gabe Ruttner Date: Mon, 18 May 2026 15:51:08 -0400 Subject: [PATCH] fix: clamp set interval guage to ma interval --- internal/operation/interval.go | 6 +++++- internal/operation/interval_test.go | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/internal/operation/interval.go b/internal/operation/interval.go index bb79145bd7..2431ed7088 100644 --- a/internal/operation/interval.go +++ b/internal/operation/interval.go @@ -159,7 +159,11 @@ func (i *Interval) SetIntervalGauge(rowsModified int) { i.noActivityCount++ if i.noActivityCount >= i.incBackoffCount { - i.currInterval *= 2 + if i.currInterval > i.maxInterval/2 { + i.currInterval = i.maxInterval + } else { + i.currInterval *= 2 + } i.noActivityCount = 0 } } diff --git a/internal/operation/interval_test.go b/internal/operation/interval_test.go index 248b186d6a..3acd69af3c 100644 --- a/internal/operation/interval_test.go +++ b/internal/operation/interval_test.go @@ -158,6 +158,26 @@ func TestInterval_SetIntervalGauge_BackoffMechanism(t *testing.T) { assert.Equal(t, 200*time.Millisecond, interval.currInterval, "Should double again after 3 more zero-row updates") } +func TestInterval_SetIntervalGauge_CapsBeforeOverflow(t *testing.T) { + const maxDuration = time.Duration(1<<63 - 1) + + interval := &Interval{ + resourceId: testResourceID, + maxJitter: 0, + startInterval: time.Second, + currInterval: maxDuration/2 + 1, + maxInterval: maxDuration, + noActivityCount: 0, + incBackoffCount: 1, + repo: v1.NewNoOpIntervalSettingsRepository(), + } + + interval.SetIntervalGauge(0) + + assert.Equal(t, maxDuration, interval.currInterval, "Should cap before doubling overflows") + assert.Equal(t, 0, interval.noActivityCount, "Should reset count after backoff") +} + func TestInterval_SetIntervalGauge_ConcurrentAccess(t *testing.T) { interval := &Interval{ resourceId: testResourceID,