@@ -176,7 +176,7 @@ func (i *Ingester) getOrCreateBackfillTSDB(userBuckets *tsdbBuckets, userID stri
176
176
}
177
177
userBuckets .buckets = append (userBuckets .buckets , bucket )
178
178
sort .Slice (userBuckets .buckets , func (i , j int ) bool {
179
- return userBuckets .buckets [i ].bucketStart < userBuckets .buckets [i ]. bucketEnd
179
+ return userBuckets .buckets [i ].bucketStart < userBuckets .buckets [j ]. bucketStart
180
180
})
181
181
182
182
return bucket , nil
@@ -286,7 +286,7 @@ func (i *Ingester) openExistingBackfillTSDB(ctx context.Context) error {
286
286
for _ , buckets := range i .TSDBState .backfillDBs .tsdbs {
287
287
buckets .Lock ()
288
288
sort .Slice (buckets .buckets , func (i , j int ) bool {
289
- return buckets .buckets [i ].bucketStart < buckets .buckets [i ]. bucketEnd
289
+ return buckets .buckets [i ].bucketStart < buckets .buckets [j ]. bucketStart
290
290
})
291
291
buckets .Unlock ()
292
292
}
@@ -494,63 +494,72 @@ func (i *Ingester) closeOldBackfillTSDBsAndDelete(gracePeriod int64) error {
494
494
}
495
495
496
496
func (i * Ingester ) runOnBucketsBefore (deleteBucket bool , gracePeriodFunc func (t int64 ) int64 , f func (db * userTSDB ) error ) error {
497
- i .TSDBState .backfillDBs .closeAndShipMtx .Lock ()
498
- defer i .TSDBState .backfillDBs .closeAndShipMtx .Unlock ()
497
+ i .TSDBState .backfillDBs .compactShipDeleteMtx .Lock ()
498
+ defer i .TSDBState .backfillDBs .compactShipDeleteMtx .Unlock ()
499
499
500
500
type tempType struct {
501
- userID string
502
- buckets * tsdbBuckets
501
+ userID string
502
+ cutoffTime int64
503
+ buckets * tsdbBuckets
503
504
}
504
505
505
506
var usersHavingOldTSDBs []tempType
506
507
507
508
// Collecting users who have old TSDBs.
508
509
i .TSDBState .backfillDBs .tsdbsMtx .RLock ()
509
510
for userID , userBuckets := range i .TSDBState .backfillDBs .tsdbs {
511
+ cutoffTime := int64 (0 )
512
+ i .userStatesMtx .RLock ()
513
+ mainDB := i .TSDBState .dbs [userID ]
514
+ i .userStatesMtx .RUnlock ()
510
515
userBuckets .RLock ()
516
+ if mainDB != nil {
517
+ cutoffTime = gracePeriodFunc (mainDB .Head ().MaxTime ())
518
+ } else {
519
+ // There is no main TSDB. So use the maxt of the last bucket.
520
+ cutoffTime = gracePeriodFunc (userBuckets .buckets [len (userBuckets .buckets )- 1 ].db .Head ().MaxTime ())
521
+ }
511
522
for _ , bucket := range userBuckets .buckets {
512
- if bucket .bucketEnd < gracePeriodFunc (bucket .db .Head ().MaxTime ()) {
513
- usersHavingOldTSDBs = append (usersHavingOldTSDBs , tempType {
514
- userID : userID ,
515
- buckets : userBuckets ,
516
- })
523
+ if bucket .bucketEnd >= cutoffTime {
517
524
break
518
525
}
526
+ usersHavingOldTSDBs = append (usersHavingOldTSDBs , tempType {
527
+ userID : userID ,
528
+ cutoffTime : cutoffTime ,
529
+ buckets : userBuckets ,
530
+ })
519
531
}
520
532
userBuckets .RUnlock ()
521
533
}
522
534
i .TSDBState .backfillDBs .tsdbsMtx .RUnlock ()
523
535
524
536
var merr tsdb_errors.MultiError
525
537
for _ , user := range usersHavingOldTSDBs {
538
+ idx := 0
526
539
for {
527
- user .buckets .Lock ()
528
- if len (user .buckets .buckets ) == 0 {
529
- user .buckets .Unlock ()
540
+ user .buckets .RLock ()
541
+ if len (user .buckets .buckets ) == 0 || idx == len ( user . buckets . buckets ) {
542
+ user .buckets .RUnlock ()
530
543
break
531
544
}
532
- bucket := user .buckets .buckets [0 ]
533
- if bucket .bucketEnd >= gracePeriodFunc ( bucket . db . Head (). MaxTime ()) {
534
- user .buckets .Unlock ()
545
+ bucket := user .buckets .buckets [idx ]
546
+ if bucket .bucketEnd >= user . cutoffTime {
547
+ user .buckets .RUnlock ()
535
548
break
536
549
}
537
- if deleteBucket {
538
- user .buckets .buckets = user .buckets .buckets [1 :]
539
- }
540
- user .buckets .Unlock ()
550
+ user .buckets .RUnlock ()
541
551
542
552
if err := f (bucket .db ); err != nil {
543
553
merr .Add (err )
544
- if deleteBucket {
545
- // Restore back the old slice to attempt running later.
546
- // As the slice would be small and the failure would be rare,
547
- // we are not caring about efficient slice management.
548
- user .buckets .Lock ()
549
- user .buckets .buckets = append ([]* tsdbBucket {bucket }, user .buckets .buckets ... )
550
- user .buckets .Unlock ()
551
- }
552
554
break
553
555
}
556
+ idx ++
557
+ if deleteBucket {
558
+ user .buckets .Lock ()
559
+ user .buckets .buckets = user .buckets .buckets [1 :]
560
+ user .buckets .Unlock ()
561
+ idx --
562
+ }
554
563
}
555
564
556
565
if deleteBucket {
@@ -570,9 +579,9 @@ func (i *Ingester) runOnBucketsBefore(deleteBucket bool, gracePeriodFunc func(t
570
579
571
580
// Assumes 1h bucket range for . TODO(codesome): protect stuff with locks.
572
581
type backfillTSDBs struct {
573
- tsdbsMtx sync.RWMutex
574
- closeAndShipMtx sync.Mutex
575
- tsdbs map [string ]* tsdbBuckets
582
+ tsdbsMtx sync.RWMutex
583
+ compactShipDeleteMtx sync.Mutex
584
+ tsdbs map [string ]* tsdbBuckets
576
585
}
577
586
578
587
func newBackfillTSDBs () * backfillTSDBs {
@@ -620,8 +629,8 @@ func overlapsOpenInterval(mint1, maxt1, mint2, maxt2 int64) bool {
620
629
// getBucketName returns the string representation of the bucket.
621
630
// YYYY_MM_DD_HH_YYYY_MM_DD_HH
622
631
func getBucketName (start , end int64 ) string {
623
- startTime := model .Time (start ).Time ()
624
- endTime := model .Time (end ).Time ()
632
+ startTime := model .Time (start ).Time (). UTC ()
633
+ endTime := model .Time (end ).Time (). UTC ()
625
634
626
635
return fmt .Sprintf (
627
636
"%04d_%02d_%02d_%02d_%04d_%02d_%02d_%02d" ,
0 commit comments