Fix for appendHistogram

Signed-off-by: Carrie Edwards <edwrdscarrie@gmail.com>
This commit is contained in:
Carrie Edwards 2026-05-05 09:52:37 -07:00
parent 6536fc6b3c
commit 55effbfc3a
2 changed files with 71 additions and 2 deletions

View File

@ -1873,7 +1873,13 @@ func (s *memSeries) appendHistogram(st, t int64, h *histogram.Histogram, appendI
// chunk reference afterwards and mmap used up chunks.
// Ignoring ok is ok, since we don't want to compare to the wrong previous appender anyway.
prevApp, _ := s.app.(*chunkenc.HistogramAppender)
var prevApp *chunkenc.HistogramAppender
switch p := s.app.(type) {
case *chunkenc.HistogramAppender:
prevApp = p
case *chunkenc.HistogramSTAppender:
prevApp = &p.HistogramAppender
}
c, sampleInOrder, chunkCreated := s.histogramsAppendPreprocessor(t, chunkenc.ValHistogram.ChunkEncoding(o.useXOR2), o)
if !sampleInOrder {
@ -1930,7 +1936,13 @@ func (s *memSeries) appendFloatHistogram(st, t int64, fh *histogram.FloatHistogr
// chunk reference afterwards and mmap used up chunks.
// Ignoring ok is ok, since we don't want to compare to the wrong previous appender anyway.
prevApp, _ := s.app.(*chunkenc.FloatHistogramAppender)
var prevApp *chunkenc.FloatHistogramAppender
switch p := s.app.(type) {
case *chunkenc.FloatHistogramAppender:
prevApp = p
case *chunkenc.FloatHistogramSTAppender:
prevApp = &p.FloatHistogramAppender
}
c, sampleInOrder, chunkCreated := s.histogramsAppendPreprocessor(t, chunkenc.ValFloatHistogram.ChunkEncoding(o.useXOR2), o)
if !sampleInOrder {

View File

@ -5179,6 +5179,63 @@ func TestHistogramCounterResetHeader(t *testing.T) {
}
}
func TestHistogramSTCounterResetHeaderOnChunkCut(t *testing.T) {
for _, floatHisto := range []bool{false, true} {
t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) {
l := labels.FromStrings("a", "b")
opts := newTestHeadDefaultOptions(2, false)
opts.EnableXOR2Encoding.Store(true)
head, _ := newTestHeadWithOptions(t, compression.None, opts)
t.Cleanup(func() {
require.NoError(t, head.Close())
})
require.NoError(t, head.Init(0))
appendHistogram := func(ts int64, h *histogram.Histogram) {
app := head.Appender(context.Background())
var err error
if floatHisto {
_, err = app.AppendHistogram(0, l, ts, nil, h.ToFloat(nil))
} else {
_, err = app.AppendHistogram(0, l, ts, h.Copy(), nil)
}
require.NoError(t, err)
require.NoError(t, app.Commit())
}
h1 := tsdbutil.GenerateTestHistogram(0)
h2 := tsdbutil.GenerateTestHistogram(1)
// Chunk range is 2, so appending at t=1 and t=2 cuts a new chunk on the second append.
appendHistogram(1, h1)
appendHistogram(2, h2)
ms, _, err := head.getOrCreate(l.Hash(), l, false)
require.NoError(t, err)
require.NotNil(t, ms.headChunks)
require.NotNil(t, ms.headChunks.prev)
if floatHisto {
prevChunk, ok := ms.headChunks.prev.chunk.(*chunkenc.FloatHistogramSTChunk)
require.True(t, ok)
require.Equal(t, chunkenc.UnknownCounterReset, prevChunk.GetCounterResetHeader())
headChunk, ok := ms.headChunks.chunk.(*chunkenc.FloatHistogramSTChunk)
require.True(t, ok)
require.Equal(t, chunkenc.NotCounterReset, headChunk.GetCounterResetHeader())
} else {
prevChunk, ok := ms.headChunks.prev.chunk.(*chunkenc.HistogramSTChunk)
require.True(t, ok)
require.Equal(t, chunkenc.UnknownCounterReset, prevChunk.GetCounterResetHeader())
headChunk, ok := ms.headChunks.chunk.(*chunkenc.HistogramSTChunk)
require.True(t, ok)
require.Equal(t, chunkenc.NotCounterReset, headChunk.GetCounterResetHeader())
}
})
}
}
func TestOOOHistogramCounterResetHeaders(t *testing.T) {
for _, floatHisto := range []bool{true, false} {
t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) {