@@ -24,6 +24,7 @@ import (
2424 "github.com/cortexproject/cortex/pkg/storage/tsdb"
2525 "github.com/cortexproject/cortex/pkg/storage/tsdb/bucketindex"
2626 cortex_testutil "github.com/cortexproject/cortex/pkg/storage/tsdb/testutil"
27+ "github.com/cortexproject/cortex/pkg/util"
2728 util_log "github.com/cortexproject/cortex/pkg/util/log"
2829 "github.com/cortexproject/cortex/pkg/util/services"
2930)
@@ -86,8 +87,9 @@ func TestBlockCleaner_KeyPermissionDenied(t *testing.T) {
8687 Name : blocksMarkedForDeletionName ,
8788 Help : blocksMarkedForDeletionHelp ,
8889 }, append (commonLabels , reasonLabelName ))
90+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
8991
90- cleaner := NewBlocksCleaner (cfg , mbucket , scanner , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
92+ cleaner := NewBlocksCleaner (cfg , mbucket , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
9193
9294 // Clean User with no error
9395 cleaner .bucketClient = bkt
@@ -193,8 +195,9 @@ func testBlocksCleanerWithOptions(t *testing.T, options testBlocksCleanerOptions
193195 Name : blocksMarkedForDeletionName ,
194196 Help : blocksMarkedForDeletionHelp ,
195197 }, append (commonLabels , reasonLabelName ))
198+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
196199
197- cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
200+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
198201 require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
199202 defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
200203
@@ -354,8 +357,9 @@ func TestBlocksCleaner_ShouldContinueOnBlockDeletionFailure(t *testing.T) {
354357 Name : blocksMarkedForDeletionName ,
355358 Help : blocksMarkedForDeletionHelp ,
356359 }, append (commonLabels , reasonLabelName ))
360+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
357361
358- cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
362+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
359363 require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
360364 defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
361365
@@ -418,8 +422,9 @@ func TestBlocksCleaner_ShouldRebuildBucketIndexOnCorruptedOne(t *testing.T) {
418422 Name : blocksMarkedForDeletionName ,
419423 Help : blocksMarkedForDeletionHelp ,
420424 }, append (commonLabels , reasonLabelName ))
425+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
421426
422- cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
427+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , nil , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
423428 require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
424429 defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
425430
@@ -476,8 +481,9 @@ func TestBlocksCleaner_ShouldRemoveMetricsForTenantsNotBelongingAnymoreToTheShar
476481 Name : blocksMarkedForDeletionName ,
477482 Help : blocksMarkedForDeletionHelp ,
478483 }, append (commonLabels , reasonLabelName ))
484+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
479485
480- cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
486+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
481487 activeUsers , deleteUsers , err := cleaner .scanUsers (ctx )
482488 require .NoError (t , err )
483489 require .NoError (t , cleaner .cleanUpActiveUsers (ctx , activeUsers , true ))
@@ -617,8 +623,9 @@ func TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod(t *testing.T) {
617623 Name : blocksMarkedForDeletionName ,
618624 Help : blocksMarkedForDeletionHelp ,
619625 }, append (commonLabels , reasonLabelName ))
626+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
620627
621- cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion )
628+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time . Second , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
622629
623630 assertBlockExists := func (user string , block ulid.ULID , expectExists bool ) {
624631 exists , err := bucketClient .Exists (ctx , path .Join (user , block .String (), metadata .MetaFilename ))
@@ -811,6 +818,83 @@ func TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod(t *testing.T) {
811818 }
812819}
813820
821+ func TestBlocksCleaner_CleanPartitionedGroupInfo (t * testing.T ) {
822+ bucketClient , _ := cortex_testutil .PrepareFilesystemBucket (t )
823+ bucketClient = bucketindex .BucketWithGlobalMarkers (bucketClient )
824+
825+ ts := func (hours int ) int64 {
826+ return time .Now ().Add (time .Duration (hours )* time .Hour ).Unix () * 1000
827+ }
828+
829+ userID := "user-1"
830+ partitionedGroupID := uint32 (123 )
831+ partitionCount := 1
832+ startTime := ts (- 10 )
833+ endTime := ts (- 8 )
834+ block1 := createTSDBBlock (t , bucketClient , userID , startTime , endTime , nil )
835+
836+ cfg := BlocksCleanerConfig {
837+ DeletionDelay : time .Hour ,
838+ CleanupInterval : time .Minute ,
839+ CleanupConcurrency : 1 ,
840+ ShardingStrategy : util .ShardingStrategyShuffle ,
841+ CompactionStrategy : util .CompactionStrategyPartitioning ,
842+ }
843+
844+ ctx := context .Background ()
845+ logger := log .NewNopLogger ()
846+ reg := prometheus .NewPedanticRegistry ()
847+ scanner := tsdb .NewUsersScanner (bucketClient , tsdb .AllUsers , logger )
848+ cfgProvider := newMockConfigProvider ()
849+ blocksMarkedForDeletion := promauto .With (reg ).NewCounterVec (prometheus.CounterOpts {
850+ Name : blocksMarkedForDeletionName ,
851+ Help : blocksMarkedForDeletionHelp ,
852+ }, append (commonLabels , reasonLabelName ))
853+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
854+
855+ cleaner := NewBlocksCleaner (cfg , bucketClient , scanner , 60 * time .Second , cfgProvider , logger , "test-cleaner" , reg , time .Minute , 30 * time .Second , blocksMarkedForDeletion , dummyGaugeVec )
856+
857+ userBucket := bucket .NewUserBucketClient (userID , bucketClient , cfgProvider )
858+
859+ partitionedGroupInfo := PartitionedGroupInfo {
860+ PartitionedGroupID : partitionedGroupID ,
861+ PartitionCount : partitionCount ,
862+ Partitions : []Partition {
863+ {
864+ PartitionID : 0 ,
865+ Blocks : []ulid.ULID {block1 },
866+ },
867+ },
868+ RangeStart : startTime ,
869+ RangeEnd : endTime ,
870+ CreationTime : time .Now ().Add (- 5 * time .Minute ).Unix (),
871+ Version : PartitionedGroupInfoVersion1 ,
872+ }
873+ _ , err := UpdatePartitionedGroupInfo (ctx , userBucket , logger , partitionedGroupInfo )
874+ require .NoError (t , err )
875+
876+ visitMarker := & partitionVisitMarker {
877+ PartitionedGroupID : partitionedGroupID ,
878+ PartitionID : 0 ,
879+ Status : Completed ,
880+ VisitTime : time .Now ().Add (- 2 * time .Minute ).Unix (),
881+ }
882+ visitMarkerManager := NewVisitMarkerManager (userBucket , logger , "dummy-cleaner" , visitMarker )
883+ err = visitMarkerManager .updateVisitMarker (ctx )
884+ require .NoError (t , err )
885+
886+ cleaner .cleanPartitionedGroupInfo (ctx , userBucket , logger , userID )
887+
888+ partitionedGroupFileExists , err := userBucket .Exists (ctx , GetPartitionedGroupFile (partitionedGroupID ))
889+ require .NoError (t , err )
890+ require .False (t , partitionedGroupFileExists )
891+
892+ block1DeletionMarkerExists , err := userBucket .Exists (ctx , path .Join (block1 .String (), metadata .DeletionMarkFilename ))
893+ require .NoError (t , err )
894+ require .True (t , block1DeletionMarkerExists )
895+
896+ }
897+
814898type mockConfigProvider struct {
815899 userRetentionPeriods map [string ]time.Duration
816900}
0 commit comments