From f649968c692b164fbb86e20cefb24593feb13f51 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 1 Sep 2022 13:51:06 -0700 Subject: [PATCH] tier: avoid stats infinite loop in forwardTo method (#15640) under some sequence of events following code would reach an infinite loop. ``` idx1, idx2 := 0, 1 for ; idx2 != idx1; idx2++ { fmt.Println(idx2) } ``` fixes #15639 --- cmd/tier-last-day-stats.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cmd/tier-last-day-stats.go b/cmd/tier-last-day-stats.go index cc8b1cbb4..b4bb8199b 100644 --- a/cmd/tier-last-day-stats.go +++ b/cmd/tier-last-day-stats.go @@ -38,6 +38,10 @@ func (l *lastDayTierStats) addStats(ts tierStats) { // forwardTo moves time to t, clearing entries between last update and t. func (l *lastDayTierStats) forwardTo(t time.Time) { + if t.IsZero() { + t = time.Now() + } + since := t.Sub(l.UpdatedAt).Hours() // within the hour since l.UpdatedAt if since < 1 { @@ -45,15 +49,17 @@ func (l *lastDayTierStats) forwardTo(t time.Time) { } idx, lastIdx := t.Hour(), l.UpdatedAt.Hour() - l.UpdatedAt = t + + l.UpdatedAt = t // update to the latest time index if since >= 24 { l.Bins = [24]tierStats{} return } - for ; lastIdx != idx; lastIdx++ { - l.Bins[(lastIdx+1)%24] = tierStats{} + for lastIdx != idx { + lastIdx = (lastIdx + 1) % 24 + l.Bins[lastIdx] = tierStats{} } }