@@ -24,6 +24,7 @@ import (
24
24
"github.com/cortexproject/cortex/pkg/storage/tsdb"
25
25
"github.com/cortexproject/cortex/pkg/storage/tsdb/bucketindex"
26
26
cortex_testutil "github.com/cortexproject/cortex/pkg/storage/tsdb/testutil"
27
+ "github.com/cortexproject/cortex/pkg/util"
27
28
util_log "github.com/cortexproject/cortex/pkg/util/log"
28
29
"github.com/cortexproject/cortex/pkg/util/services"
29
30
)
@@ -86,8 +87,9 @@ func TestBlockCleaner_KeyPermissionDenied(t *testing.T) {
86
87
Name : blocksMarkedForDeletionName ,
87
88
Help : blocksMarkedForDeletionHelp ,
88
89
}, append (commonLabels , reasonLabelName ))
90
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
89
91
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 )
91
93
92
94
// Clean User with no error
93
95
cleaner .bucketClient = bkt
@@ -193,8 +195,9 @@ func testBlocksCleanerWithOptions(t *testing.T, options testBlocksCleanerOptions
193
195
Name : blocksMarkedForDeletionName ,
194
196
Help : blocksMarkedForDeletionHelp ,
195
197
}, append (commonLabels , reasonLabelName ))
198
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
196
199
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 )
198
201
require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
199
202
defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
200
203
@@ -354,8 +357,9 @@ func TestBlocksCleaner_ShouldContinueOnBlockDeletionFailure(t *testing.T) {
354
357
Name : blocksMarkedForDeletionName ,
355
358
Help : blocksMarkedForDeletionHelp ,
356
359
}, append (commonLabels , reasonLabelName ))
360
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
357
361
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 )
359
363
require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
360
364
defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
361
365
@@ -418,8 +422,9 @@ func TestBlocksCleaner_ShouldRebuildBucketIndexOnCorruptedOne(t *testing.T) {
418
422
Name : blocksMarkedForDeletionName ,
419
423
Help : blocksMarkedForDeletionHelp ,
420
424
}, append (commonLabels , reasonLabelName ))
425
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
421
426
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 )
423
428
require .NoError (t , services .StartAndAwaitRunning (ctx , cleaner ))
424
429
defer services .StopAndAwaitTerminated (ctx , cleaner ) //nolint:errcheck
425
430
@@ -476,8 +481,9 @@ func TestBlocksCleaner_ShouldRemoveMetricsForTenantsNotBelongingAnymoreToTheShar
476
481
Name : blocksMarkedForDeletionName ,
477
482
Help : blocksMarkedForDeletionHelp ,
478
483
}, append (commonLabels , reasonLabelName ))
484
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
479
485
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 )
481
487
activeUsers , deleteUsers , err := cleaner .scanUsers (ctx )
482
488
require .NoError (t , err )
483
489
require .NoError (t , cleaner .cleanUpActiveUsers (ctx , activeUsers , true ))
@@ -617,8 +623,9 @@ func TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod(t *testing.T) {
617
623
Name : blocksMarkedForDeletionName ,
618
624
Help : blocksMarkedForDeletionHelp ,
619
625
}, append (commonLabels , reasonLabelName ))
626
+ dummyGaugeVec := prometheus .NewGaugeVec (prometheus.GaugeOpts {}, []string {"test" })
620
627
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 )
622
629
623
630
assertBlockExists := func (user string , block ulid.ULID , expectExists bool ) {
624
631
exists , err := bucketClient .Exists (ctx , path .Join (user , block .String (), metadata .MetaFilename ))
@@ -811,6 +818,83 @@ func TestBlocksCleaner_ShouldRemoveBlocksOutsideRetentionPeriod(t *testing.T) {
811
818
}
812
819
}
813
820
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
+
814
898
type mockConfigProvider struct {
815
899
userRetentionPeriods map [string ]time.Duration
816
900
}
0 commit comments