diff --git a/tsdb/chunkenc/float_histogram_st.go b/tsdb/chunkenc/float_histogram_st.go index 90ef55290a..98f349d8d9 100644 --- a/tsdb/chunkenc/float_histogram_st.go +++ b/tsdb/chunkenc/float_histogram_st.go @@ -139,7 +139,7 @@ func (c *FloatHistogramSTChunk) Appender() (Appender, error) { st: it.st, stDiff: it.stDiff, firstSTKnown: it.firstSTKnown, - firstSTChangeOn: uint16(it.firstSTChangeOn), + firstSTChangeOn: it.firstSTChangeOn, }, } return a, nil @@ -409,7 +409,13 @@ func (*FloatHistogramSTAppender) AppendHistogram(*HistogramAppender, int64, int6 // AppendFloatHistogram implements Appender for FloatHistogramSTAppender. func (a *FloatHistogramSTAppender) AppendFloatHistogram(prev *FloatHistogramAppender, st, t int64, fh *histogram.FloatHistogram, appendOnly bool) (Chunk, bool, Appender, error) { - if a.NumSamples() == 0 { + numSamples := a.NumSamples() + + if numSamples == int(a.sampleCountMask()) { + panic("chunk capacity exceeded") + } + + if numSamples == 0 { a.appendFloatHistogramST(st, t, fh) if fh.CounterResetHint == histogram.GaugeType { a.setCounterResetHeader(GaugeType) diff --git a/tsdb/chunkenc/float_histogram_st_test.go b/tsdb/chunkenc/float_histogram_st_test.go index dccfea4e75..6e64010994 100644 --- a/tsdb/chunkenc/float_histogram_st_test.go +++ b/tsdb/chunkenc/float_histogram_st_test.go @@ -577,3 +577,7 @@ func TestFloatHistogramSTAppenderPreviousEmbeddedAppenderUsesSTHeader(t *testing require.NoError(t, err) require.Equal(t, CounterReset, nextChunk.GetCounterResetHeader()) } + +func TestFloatHistogramSTChunkOverFlowPanics(t *testing.T) { + testChunkOverFlowPanics(t, EncFloatHistogramST, ValFloatHistogram) +} diff --git a/tsdb/chunkenc/histogram_st.go b/tsdb/chunkenc/histogram_st.go index fec4463340..5b1226224d 100644 --- a/tsdb/chunkenc/histogram_st.go +++ b/tsdb/chunkenc/histogram_st.go @@ -127,7 +127,7 @@ func (c *HistogramSTChunk) Appender() (Appender, error) { st: it.st, stDiff: it.stDiff, firstSTKnown: it.firstSTKnown, - firstSTChangeOn: uint16(it.firstSTChangeOn), + firstSTChangeOn: it.firstSTChangeOn, }, } return a, nil @@ -412,7 +412,13 @@ func (*HistogramSTAppender) AppendFloatHistogram(*FloatHistogramAppender, int64, // AppendHistogram implements Appender for HistogramSTAppender. func (a *HistogramSTAppender) AppendHistogram(prev *HistogramAppender, st, t int64, h *histogram.Histogram, appendOnly bool) (Chunk, bool, Appender, error) { - if a.NumSamples() == 0 { + numSamples := a.NumSamples() + + if numSamples == int(a.sampleCountMask()) { + panic("chunk capacity exceeded") + } + + if numSamples == 0 { a.appendHistogramST(st, t, h) if h.CounterResetHint == histogram.GaugeType { a.setCounterResetHeader(GaugeType) diff --git a/tsdb/chunkenc/histogram_st_test.go b/tsdb/chunkenc/histogram_st_test.go index f5b3d3eeb6..4462a5f0f0 100644 --- a/tsdb/chunkenc/histogram_st_test.go +++ b/tsdb/chunkenc/histogram_st_test.go @@ -574,3 +574,7 @@ func TestHistogramSTAppenderPreviousEmbeddedAppenderUsesSTHeader(t *testing.T) { require.NoError(t, err) require.Equal(t, CounterReset, nextChunk.GetCounterResetHeader()) } + +func TestHistogramSTChunkOverFlowPanics(t *testing.T) { + testChunkOverFlowPanics(t, EncHistogramST, ValHistogram) +} diff --git a/tsdb/chunkenc/st.go b/tsdb/chunkenc/st.go index 2bfb2d7353..026f523e17 100644 --- a/tsdb/chunkenc/st.go +++ b/tsdb/chunkenc/st.go @@ -21,7 +21,7 @@ const ( type stEncoder struct { st, stDiff int64 - firstSTChangeOn uint16 + firstSTChangeOn uint8 firstSTKnown bool } @@ -48,18 +48,7 @@ func writeHeaderFirstSTChangeOn(b []byte, firstSTChangeOn uint16) { } func readSTHeader(b []byte) (firstSTKnown bool, firstSTChangeOn uint8) { - if b[0] == 0x00 { - return false, 0 - } - if b[0] == 0x80 { - return true, 0 - } - mask := byte(0x80) - if b[0]&mask != 0 { - firstSTKnown = true - } - mask = 0x7F - return firstSTKnown, b[0] & mask + return b[0]&0x80 != 0, b[0] & 0x7F } // encode writes the start timestamp data for the current histogram or float histogram sample and updates the encoder state. @@ -92,7 +81,7 @@ func (e *stEncoder) encode(b *bstream, num uint16, curT, prevT, st int64) { if e.firstSTChangeOn == 0 { if st != e.st || num-1 == maxFirstSTChangeOn { stDiff := prevT - st - e.firstSTChangeOn = num - 1 + e.firstSTChangeOn = uint8(num - 1) writeHeaderFirstSTChangeOn(b.bytes()[histogramHeaderSize-1:], num-1) putVarbitInt(b, stDiff) e.stDiff = stDiff