diff --git a/pkg/metricstore/buffer.go b/pkg/metricstore/buffer.go index 72467f6c..52e3b287 100644 --- a/pkg/metricstore/buffer.go +++ b/pkg/metricstore/buffer.go @@ -42,6 +42,7 @@ package metricstore import ( "errors" + "math" "sync" "time" @@ -176,6 +177,17 @@ type buffer struct { archived bool closed bool lastUsed int64 + + // Running statistics over the non-NaN values currently in data. + // avg is derived as statSum/statSamples, never stored. + // statsValid is false when the cached aggregate may be stale (after an + // overwrite, or for a bare-constructed buffer); a stats query recomputes + // before using the cache. Zero value (false) fails safe to "recompute". + statSum float64 + statSamples int + statMin float64 + statMax float64 + statsValid bool } func newBuffer(ts, freq int64) *buffer { @@ -187,6 +199,11 @@ func newBuffer(ts, freq int64) *buffer { b.archived = false b.closed = false b.data = b.data[:0] + b.statSum = 0 + b.statSamples = 0 + b.statMin = math.MaxFloat32 + b.statMax = -math.MaxFloat32 + b.statsValid = true return b } diff --git a/pkg/metricstore/stats_test.go b/pkg/metricstore/stats_test.go new file mode 100644 index 00000000..f437f0bd --- /dev/null +++ b/pkg/metricstore/stats_test.go @@ -0,0 +1,30 @@ +// Copyright (C) NHR@FAU, University Erlangen-Nuremberg. +// All rights reserved. This file is part of cc-backend. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package metricstore + +import ( + "math" + "testing" +) + +func TestNewBufferStatsInitialized(t *testing.T) { + b := newBuffer(100, 10) + if b.statSamples != 0 { + t.Errorf("statSamples = %d, want 0", b.statSamples) + } + if b.statSum != 0 { + t.Errorf("statSum = %v, want 0", b.statSum) + } + if b.statMin != math.MaxFloat32 { + t.Errorf("statMin = %v, want MaxFloat32 sentinel", b.statMin) + } + if b.statMax != -math.MaxFloat32 { + t.Errorf("statMax = %v, want -MaxFloat32 sentinel", b.statMax) + } + if !b.statsValid { + t.Error("statsValid = false, want true for a fresh empty buffer") + } +}