diff --git a/tsdb/head_append_v2_test.go b/tsdb/head_append_v2_test.go index abf0bd94d3..1b7c0185a2 100644 --- a/tsdb/head_append_v2_test.go +++ b/tsdb/head_append_v2_test.go @@ -2485,7 +2485,7 @@ func testHeadAppenderV2AppendStaleHistogram(t *testing.T, floatHistogram bool) { } func TestHeadAppenderV2_Append_CounterResetHeader(t *testing.T) { - for _, floatHisto := range []bool{true} { // FIXME + for _, floatHisto := range []bool{true, false} { t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) { l := labels.FromStrings("a", "b") head, _ := newTestHead(t, 1000, compression.None, false) @@ -2536,32 +2536,31 @@ func TestHeadAppenderV2_Append_CounterResetHeader(t *testing.T) { h := tsdbutil.GenerateTestHistograms(1)[0] h.PositiveBuckets = []int64{100, 1, 1, 1} h.NegativeBuckets = []int64{100, 1, 1, 1} - h.Count = 1000 + // Count = positive delta-decoded (100+101+102+103=406) + negative (406) + ZeroCount (2) = 814. + h.Count = 814 // First histogram is UnknownCounterReset. appendHistogram(h) checkExpCounterResetHeader(chunkenc.UnknownCounterReset) - // Another normal histogram. - h.Count++ + // Another normal histogram: increment a bucket and Count consistently. + h.PositiveBuckets[len(h.PositiveBuckets)-1]++ + h.Count++ // Count = 815. appendHistogram(h) checkExpCounterResetHeader() - // Counter reset via Count. - h.Count-- + // Counter reset: decrement the same bucket and Count. + h.PositiveBuckets[len(h.PositiveBuckets)-1]-- + h.Count-- // Count = 814. appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) - // Add 2 non-counter reset histogram chunks (each chunk targets 1024 bytes which contains ~500 int histogram - // samples or ~1000 float histogram samples). - numAppend := 2000 - if floatHisto { - numAppend = 1000 - } - for i := 0; i < numAppend; i++ { + // Add 2 non-counter reset histogram chunks. + ms, _, err := head.getOrCreate(l.Hash(), l, false) + require.NoError(t, err) + for ms.headChunkCount.Load() < 3 { appendHistogram(h) } - checkExpCounterResetHeader(chunkenc.NotCounterReset, chunkenc.NotCounterReset) // Changing schema will cut a new chunk with unknown counter reset. @@ -2577,28 +2576,36 @@ func TestHeadAppenderV2_Append_CounterResetHeader(t *testing.T) { // Counter reset by removing a positive bucket. h.PositiveSpans[1].Length-- h.PositiveBuckets = h.PositiveBuckets[1:] + // After removal: positive delta-decoded (1+2+3=6) + negative (406) + ZeroCount (2) = 414. + h.Count = 414 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Counter reset by removing a negative bucket. h.NegativeSpans[1].Length-- h.NegativeBuckets = h.NegativeBuckets[1:] + // After removal: positive (6) + negative delta-decoded (1+2+3=6) + ZeroCount (2) = 14. + h.Count = 14 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Add 2 non-counter reset histogram chunks. Just to have some non-counter reset chunks in between. - for range 2000 { + for ms.headChunkCount.Load() < 3 { appendHistogram(h) } checkExpCounterResetHeader(chunkenc.NotCounterReset, chunkenc.NotCounterReset) // Counter reset with counter reset in a positive bucket. h.PositiveBuckets[len(h.PositiveBuckets)-1]-- + // After: positive delta-decoded (1+2+2=5) + negative (6) + ZeroCount (2) = 13. + h.Count = 13 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Counter reset with counter reset in a negative bucket. h.NegativeBuckets[len(h.NegativeBuckets)-1]-- + // After: positive (5) + negative delta-decoded (1+2+2=5) + ZeroCount (2) = 12. + h.Count = 12 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) }) diff --git a/tsdb/head_test.go b/tsdb/head_test.go index c1af92e2a2..0b957fbaf8 100644 --- a/tsdb/head_test.go +++ b/tsdb/head_test.go @@ -5299,7 +5299,7 @@ func testHistogramStaleSampleHelper(t *testing.T, floatHistogram bool) { } func TestHistogramCounterResetHeader(t *testing.T) { - for _, floatHisto := range []bool{true} { // FIXME + for _, floatHisto := range []bool{true, false} { t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) { l := labels.FromStrings("a", "b") head, _ := newTestHead(t, 1000, compression.None, false) @@ -5350,32 +5350,31 @@ func TestHistogramCounterResetHeader(t *testing.T) { h := tsdbutil.GenerateTestHistograms(1)[0] h.PositiveBuckets = []int64{100, 1, 1, 1} h.NegativeBuckets = []int64{100, 1, 1, 1} - h.Count = 1000 + // Count = positive delta-decoded (100+101+102+103=406) + negative (406) + ZeroCount (2) = 814. + h.Count = 814 // First histogram is UnknownCounterReset. appendHistogram(h) checkExpCounterResetHeader(chunkenc.UnknownCounterReset) - // Another normal histogram. - h.Count++ + // Another normal histogram: increment a bucket and Count consistently. + h.PositiveBuckets[len(h.PositiveBuckets)-1]++ + h.Count++ // Count = 815. appendHistogram(h) checkExpCounterResetHeader() - // Counter reset via Count. - h.Count-- + // Counter reset: decrement the same bucket and Count. + h.PositiveBuckets[len(h.PositiveBuckets)-1]-- + h.Count-- // Count = 814. appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) - // Add 2 non-counter reset histogram chunks (each chunk targets 1024 bytes which contains ~500 int histogram - // samples or ~1000 float histogram samples). - numAppend := 2000 - if floatHisto { - numAppend = 1000 - } - for i := 0; i < numAppend; i++ { + // Add 2 non-counter reset histogram chunks. + ms, _, err := head.getOrCreate(l.Hash(), l, false) + require.NoError(t, err) + for ms.headChunkCount.Load() < 3 { appendHistogram(h) } - checkExpCounterResetHeader(chunkenc.NotCounterReset, chunkenc.NotCounterReset) // Changing schema will cut a new chunk with unknown counter reset. @@ -5391,28 +5390,36 @@ func TestHistogramCounterResetHeader(t *testing.T) { // Counter reset by removing a positive bucket. h.PositiveSpans[1].Length-- h.PositiveBuckets = h.PositiveBuckets[1:] + // After removal: positive delta-decoded (1+2+3=6) + negative (406) + ZeroCount (2) = 414. + h.Count = 414 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Counter reset by removing a negative bucket. h.NegativeSpans[1].Length-- h.NegativeBuckets = h.NegativeBuckets[1:] + // After removal: positive (6) + negative delta-decoded (1+2+3=6) + ZeroCount (2) = 14. + h.Count = 14 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Add 2 non-counter reset histogram chunks. Just to have some non-counter reset chunks in between. - for range 2000 { + for ms.headChunkCount.Load() < 3 { appendHistogram(h) } checkExpCounterResetHeader(chunkenc.NotCounterReset, chunkenc.NotCounterReset) // Counter reset with counter reset in a positive bucket. h.PositiveBuckets[len(h.PositiveBuckets)-1]-- + // After: positive delta-decoded (1+2+2=5) + negative (6) + ZeroCount (2) = 13. + h.Count = 13 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) // Counter reset with counter reset in a negative bucket. h.NegativeBuckets[len(h.NegativeBuckets)-1]-- + // After: positive (5) + negative delta-decoded (1+2+2=5) + ZeroCount (2) = 12. + h.Count = 12 appendHistogram(h) checkExpCounterResetHeader(chunkenc.CounterReset) })