|
|
@ -5399,3 +5399,49 @@ func TestCuttingNewHeadChunks(t *testing.T) { |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TestHeadDetectsDuplcateSampleAtSizeLimit tests a regression where a duplicate sample
|
|
|
|
|
|
|
|
// is appended to the head, right when the head chunk is at the size limit.
|
|
|
|
|
|
|
|
// The test adds all samples as duplicate, thus expecting that the result has
|
|
|
|
|
|
|
|
// exactly half of the samples.
|
|
|
|
|
|
|
|
func TestHeadDetectsDuplicateSampleAtSizeLimit(t *testing.T) { |
|
|
|
|
|
|
|
numSamples := 1000 |
|
|
|
|
|
|
|
baseTS := int64(1695209650) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h, _ := newTestHead(t, DefaultBlockDuration, wlog.CompressionNone, false) |
|
|
|
|
|
|
|
defer func() { |
|
|
|
|
|
|
|
require.NoError(t, h.Close()) |
|
|
|
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a := h.Appender(context.Background()) |
|
|
|
|
|
|
|
var err error |
|
|
|
|
|
|
|
vals := []float64{math.MaxFloat64, 0x00} // Use the worst case scenario for the XOR encoding. Otherwise we hit the sample limit before the size limit.
|
|
|
|
|
|
|
|
for i := 0; i < numSamples; i++ { |
|
|
|
|
|
|
|
ts := baseTS + int64(i/2)*10000 |
|
|
|
|
|
|
|
a.Append(0, labels.FromStrings("foo", "bar"), ts, vals[(i/2)%len(vals)]) |
|
|
|
|
|
|
|
err = a.Commit() |
|
|
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
a = h.Appender(context.Background()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
indexReader, err := h.Index() |
|
|
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
|
|
|
chunks []chunks.Meta |
|
|
|
|
|
|
|
builder labels.ScratchBuilder |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
require.NoError(t, indexReader.Series(1, &builder, &chunks)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chunkReader, err := h.Chunks() |
|
|
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
storedSampleCount := 0 |
|
|
|
|
|
|
|
for _, chunkMeta := range chunks { |
|
|
|
|
|
|
|
chunk, err := chunkReader.Chunk(chunkMeta) |
|
|
|
|
|
|
|
require.NoError(t, err) |
|
|
|
|
|
|
|
storedSampleCount += chunk.NumSamples() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
require.Equal(t, numSamples/2, storedSampleCount) |
|
|
|
|
|
|
|
} |
|
|
|