prometheus/tsdb/chunkenc/appendable.go
George Krajcsovits 2aefd00c24
tsdb/chunkenc: take a generic Appender as the prev parameter (#18857)
The chunkenc.Appender interface's AppendHistogram and AppendFloatHistogram
methods used to require a typed previous appender (*HistogramAppender or
*FloatHistogramAppender). Callers were forced to type-assert s.app to that
concrete type before each call, discarding it (and the cross-chunk
counter-reset signal it carries) whenever the actual concrete type didn't
match -- for example when a chunk used a different histogram encoding.

Change the signature to accept the generic chunkenc.Appender interface and
move the concrete-type check inside each implementation, onto the code path
that actually needs the previous appender's state (the new-chunk branch
where setCounterResetHeader runs). The check goes through small private
interfaces -- histogramAppendable and floatHistogramAppendable -- so any
appender type that exposes the appropriate appendable() method can serve as
prev, and types that don't (xor, xor2, or a histogram appender on the
opposite-kind code path) are silently ignored.

This prepares the ground for #18609, which introduces *HistogramSTAppender
and *FloatHistogramSTAppender. Both embed their non-ST counterparts and
will satisfy the new interfaces automatically, so they can be passed as
prev without a special case in the caller.

Callers in tsdb/head_append.go and tsdb/ooo_head.go are simplified
accordingly. The Appender consumers in storage/series.go and tsdb/querier.go
were already passing nil and continue to do so unchanged.

Signed-off-by: György Krajcsovits <gyorgy.krajcsovits@grafana.com>
2026-06-09 10:41:43 +02:00

42 lines
1.8 KiB
Go

// Copyright The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package chunkenc
import "github.com/prometheus/prometheus/model/histogram"
// histogramAppendable is the subset of an integer-histogram appender's API
// that AppendHistogram needs from a previous chunk's appender in order to
// detect counter resets across chunks. It is satisfied by *HistogramAppender
// and any type that embeds it (e.g. *HistogramSTAppender). The Appender
// interface itself stays a single type so callers can hand off whichever
// concrete appender they happen to have without first type-asserting it.
type histogramAppendable interface {
appendable(*histogram.Histogram) (
positiveInserts, negativeInserts,
backwardPositiveInserts, backwardNegativeInserts []Insert,
okToAppend bool, counterResetHint CounterResetHeader,
)
}
// floatHistogramAppendable is the float-histogram counterpart of
// histogramAppendable. Note the asymmetry with the integer version: float
// histograms surface a bool counter-reset flag rather than the richer
// CounterResetHeader value used for integer histograms.
type floatHistogramAppendable interface {
appendable(*histogram.FloatHistogram) (
positiveInserts, negativeInserts,
backwardPositiveInserts, backwardNegativeInserts []Insert,
okToAppend, counterReset bool,
)
}