@ -5499,3 +5499,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 )
}