@@ -102,6 +102,7 @@ func TestSyncer_GarbageCollect_e2e(t *testing.T) {
102102
103103 blocksMarkedForDeletion := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
104104 garbageCollectedBlocks := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
105+ blockMarkedForNoCompact := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
105106 ignoreDeletionMarkFilter := block .NewIgnoreDeletionMarkFilter (nil , nil , 48 * time .Hour , fetcherConcurrency )
106107 sy , err := NewMetaSyncer (nil , nil , bkt , metaFetcher , duplicateBlocksFilter , ignoreDeletionMarkFilter , blocksMarkedForDeletion , garbageCollectedBlocks , 1 )
107108 testutil .Ok (t , err )
@@ -138,7 +139,7 @@ func TestSyncer_GarbageCollect_e2e(t *testing.T) {
138139 testutil .Ok (t , sy .GarbageCollect (ctx ))
139140
140141 // Only the level 3 block, the last source block in both resolutions should be left.
141- grouper := NewDefaultGrouper (nil , bkt , false , false , nil , blocksMarkedForDeletion , garbageCollectedBlocks , metadata .NoneFunc )
142+ grouper := NewDefaultGrouper (nil , bkt , false , false , nil , blocksMarkedForDeletion , garbageCollectedBlocks , blockMarkedForNoCompact , metadata .NoneFunc )
142143 groups , err := grouper .Groups (sy .Metas ())
143144 testutil .Ok (t , err )
144145
@@ -195,23 +196,26 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
195196
196197 ignoreDeletionMarkFilter := block .NewIgnoreDeletionMarkFilter (logger , objstore .WithNoopInstr (bkt ), 48 * time .Hour , fetcherConcurrency )
197198 duplicateBlocksFilter := block .NewDeduplicateFilter ()
199+ noCompactMarkerFilter := NewGatherNoCompactionMarkFilter (logger , objstore .WithNoopInstr (bkt ), 2 )
198200 metaFetcher , err := block .NewMetaFetcher (nil , 32 , objstore .WithNoopInstr (bkt ), "" , nil , []block.MetadataFilter {
199201 ignoreDeletionMarkFilter ,
200202 duplicateBlocksFilter ,
203+ noCompactMarkerFilter ,
201204 }, nil )
202205 testutil .Ok (t , err )
203206
204207 blocksMarkedForDeletion := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
208+ blocksMaredForNoCompact := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
205209 garbageCollectedBlocks := promauto .With (nil ).NewCounter (prometheus.CounterOpts {})
206210 sy , err := NewMetaSyncer (nil , nil , bkt , metaFetcher , duplicateBlocksFilter , ignoreDeletionMarkFilter , blocksMarkedForDeletion , garbageCollectedBlocks , 5 )
207211 testutil .Ok (t , err )
208212
209213 comp , err := tsdb .NewLeveledCompactor (ctx , reg , logger , []int64 {1000 , 3000 }, nil , mergeFunc )
210214 testutil .Ok (t , err )
211215
212- planner := NewTSDBBasedPlanner (logger , []int64 {1000 , 3000 })
216+ planner := NewPlanner (logger , []int64 {1000 , 3000 }, noCompactMarkerFilter )
213217
214- grouper := NewDefaultGrouper (logger , bkt , false , false , reg , blocksMarkedForDeletion , garbageCollectedBlocks , metadata .NoneFunc )
218+ grouper := NewDefaultGrouper (logger , bkt , false , false , reg , blocksMarkedForDeletion , garbageCollectedBlocks , blocksMaredForNoCompact , metadata .NoneFunc )
215219 bComp , err := NewBucketCompactor (logger , sy , grouper , planner , comp , dir , bkt , 2 )
216220 testutil .Ok (t , err )
217221
@@ -220,6 +224,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
220224 testutil .Equals (t , 0.0 , promtest .ToFloat64 (sy .metrics .garbageCollectedBlocks ))
221225 testutil .Equals (t , 0.0 , promtest .ToFloat64 (sy .metrics .blocksMarkedForDeletion ))
222226 testutil .Equals (t , 0.0 , promtest .ToFloat64 (sy .metrics .garbageCollectionFailures ))
227+ testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .blocksMarkedForNoCompact ))
223228 testutil .Equals (t , 0 , MetricCount (grouper .compactions ))
224229 testutil .Equals (t , 0 , MetricCount (grouper .compactionRunsStarted ))
225230 testutil .Equals (t , 0 , MetricCount (grouper .compactionRunsCompleted ))
@@ -233,7 +238,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
233238 extLabels2 := labels.Labels {{Name : "e1" , Value : "1" }}
234239 metas := createAndUpload (t , bkt , []blockgenSpec {
235240 {
236- numSamples : 100 , mint : 0 , maxt : 1000 , extLset : extLabels , res : 124 ,
241+ numSamples : 100 , mint : 500 , maxt : 1000 , extLset : extLabels , res : 124 ,
237242 series : []labels.Labels {
238243 {{Name : "a" , Value : "1" }},
239244 {{Name : "a" , Value : "2" }, {Name : "b" , Value : "2" }},
@@ -303,31 +308,42 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
303308 {{Name : "a" , Value : "7" }},
304309 },
305310 },
311+ }, []blockgenSpec {
312+ {
313+ numSamples : 100 , mint : 0 , maxt : 499 , extLset : extLabels , res : 124 ,
314+ series : []labels.Labels {
315+ {{Name : "a" , Value : "1" }},
316+ {{Name : "a" , Value : "2" }, {Name : "b" , Value : "2" }},
317+ {{Name : "a" , Value : "3" }},
318+ {{Name : "a" , Value : "4" }},
319+ },
320+ },
306321 })
307322
308323 testutil .Ok (t , bComp .Compact (ctx ))
309324 testutil .Equals (t , 5.0 , promtest .ToFloat64 (sy .metrics .garbageCollectedBlocks ))
310325 testutil .Equals (t , 5.0 , promtest .ToFloat64 (sy .metrics .blocksMarkedForDeletion ))
326+ testutil .Equals (t , 1.0 , promtest .ToFloat64 (grouper .blocksMarkedForNoCompact ))
311327 testutil .Equals (t , 0.0 , promtest .ToFloat64 (sy .metrics .garbageCollectionFailures ))
312328 testutil .Equals (t , 4 , MetricCount (grouper .compactions ))
313329 testutil .Equals (t , 1.0 , promtest .ToFloat64 (grouper .compactions .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
314330 testutil .Equals (t , 1.0 , promtest .ToFloat64 (grouper .compactions .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
315331 testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .compactions .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
316332 testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .compactions .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
317333 testutil .Equals (t , 4 , MetricCount (grouper .compactionRunsStarted ))
318- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
319- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
334+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
335+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
320336 // TODO(bwplotka): Looks like we do some unnecessary loops. Not a major problem but investigate.
321- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
322- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
337+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
338+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsStarted .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
323339 testutil .Equals (t , 4 , MetricCount (grouper .compactionRunsCompleted ))
324340 testutil .Equals (t , 2.0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
325- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
341+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
326342 // TODO(bwplotka): Looks like we do some unnecessary loops. Not a major problem but investigate.
327- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
328- testutil .Equals (t , 2 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
343+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
344+ testutil .Equals (t , 3 .0 , promtest .ToFloat64 (grouper .compactionRunsCompleted .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
329345 testutil .Equals (t , 4 , MetricCount (grouper .compactionFailures ))
330- testutil .Equals (t , 0 .0 , promtest .ToFloat64 (grouper .compactionFailures .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
346+ testutil .Equals (t , 1 .0 , promtest .ToFloat64 (grouper .compactionFailures .WithLabelValues (DefaultGroupKey (metas [0 ].Thanos ))))
331347 testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .compactionFailures .WithLabelValues (DefaultGroupKey (metas [7 ].Thanos ))))
332348 testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .compactionFailures .WithLabelValues (DefaultGroupKey (metas [4 ].Thanos ))))
333349 testutil .Equals (t , 0.0 , promtest .ToFloat64 (grouper .compactionFailures .WithLabelValues (DefaultGroupKey (metas [5 ].Thanos ))))
@@ -342,6 +358,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
342358 metas [4 ].ULID : false ,
343359 metas [5 ].ULID : false ,
344360 metas [8 ].ULID : false ,
361+ metas [9 ].ULID : false ,
345362 }
346363 others := map [string ]metadata.Meta {}
347364 testutil .Ok (t , bkt .Iter (ctx , "" , func (n string ) error {
@@ -374,7 +391,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg
374391 meta , ok := others [defaultGroupKey (124 , extLabels )]
375392 testutil .Assert (t , ok , "meta not found" )
376393
377- testutil .Equals (t , int64 (0 ), meta .MinTime )
394+ testutil .Equals (t , int64 (500 ), meta .MinTime )
378395 testutil .Equals (t , int64 (3000 ), meta .MaxTime )
379396 testutil .Equals (t , uint64 (6 ), meta .Stats .NumSeries )
380397 testutil .Equals (t , uint64 (2 * 4 * 100 ), meta .Stats .NumSamples ) // Only 2 times 4*100 because one block was empty.
@@ -413,7 +430,7 @@ type blockgenSpec struct {
413430 res int64
414431}
415432
416- func createAndUpload (t testing.TB , bkt objstore.Bucket , blocks []blockgenSpec ) (metas []* metadata.Meta ) {
433+ func createAndUpload (t testing.TB , bkt objstore.Bucket , blocks []blockgenSpec , blocksWithOutOfOrderChunks [] blockgenSpec ) (metas []* metadata.Meta ) {
417434 prepareDir , err := ioutil .TempDir ("" , "test-compact-prepare" )
418435 testutil .Ok (t , err )
419436 defer func () { testutil .Ok (t , os .RemoveAll (prepareDir )) }()
@@ -422,23 +439,35 @@ func createAndUpload(t testing.TB, bkt objstore.Bucket, blocks []blockgenSpec) (
422439 defer cancel ()
423440
424441 for _ , b := range blocks {
425- var id ulid.ULID
426- var err error
427- if b .numSamples == 0 {
428- id , err = e2eutil .CreateEmptyBlock (prepareDir , b .mint , b .maxt , b .extLset , b .res )
429- } else {
430- id , err = e2eutil .CreateBlock (ctx , prepareDir , b .series , b .numSamples , b .mint , b .maxt , b .extLset , b .res , metadata .NoneFunc )
431- }
432- testutil .Ok (t , err )
442+ id , meta := createBlock (t , ctx , prepareDir , b )
443+ metas = append (metas , meta )
444+ testutil .Ok (t , block .Upload (ctx , log .NewNopLogger (), bkt , filepath .Join (prepareDir , id .String ()), metadata .NoneFunc ))
445+ }
446+ for _ , b := range blocksWithOutOfOrderChunks {
447+ id , meta := createBlock (t , ctx , prepareDir , b )
433448
434- meta , err := metadata . ReadFromDir (filepath .Join (prepareDir , id .String ()))
449+ err := testutil . PutOutOfOrderIndex (filepath .Join (prepareDir , id .String ()), b . mint , b . maxt )
435450 testutil .Ok (t , err )
436- metas = append (metas , meta )
437451
452+ metas = append (metas , meta )
438453 testutil .Ok (t , block .Upload (ctx , log .NewNopLogger (), bkt , filepath .Join (prepareDir , id .String ()), metadata .NoneFunc ))
439454 }
455+
440456 return metas
441457}
458+ func createBlock (t testing.TB , ctx context.Context , prepareDir string , b blockgenSpec ) (id ulid.ULID , meta * metadata.Meta ) {
459+ var err error
460+ if b .numSamples == 0 {
461+ id , err = e2eutil .CreateEmptyBlock (prepareDir , b .mint , b .maxt , b .extLset , b .res )
462+ } else {
463+ id , err = e2eutil .CreateBlock (ctx , prepareDir , b .series , b .numSamples , b .mint , b .maxt , b .extLset , b .res , metadata .NoneFunc )
464+ }
465+ testutil .Ok (t , err )
466+
467+ meta , err = metadata .ReadFromDir (filepath .Join (prepareDir , id .String ()))
468+ testutil .Ok (t , err )
469+ return
470+ }
442471
443472// Regression test for #2459 issue.
444473func TestGarbageCollectDoesntCreateEmptyBlocksWithDeletionMarksOnly (t * testing.T ) {
0 commit comments