github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/storage/stores/indexshipper/compactor/retention/series.go (about)

     1  package retention
     2  
     3  import (
     4  	"github.com/prometheus/prometheus/model/labels"
     5  )
     6  
     7  type userSeries struct {
     8  	key         []byte
     9  	seriesIDLen int
    10  }
    11  
    12  func newUserSeries(seriesID []byte, userID []byte) userSeries {
    13  	key := make([]byte, 0, len(seriesID)+len(userID))
    14  	key = append(key, seriesID...)
    15  	key = append(key, userID...)
    16  	return userSeries{
    17  		key:         key,
    18  		seriesIDLen: len(seriesID),
    19  	}
    20  }
    21  
    22  func (us userSeries) Key() string {
    23  	return unsafeGetString(us.key)
    24  }
    25  
    26  func (us userSeries) SeriesID() []byte {
    27  	return us.key[:us.seriesIDLen]
    28  }
    29  
    30  func (us userSeries) UserID() []byte {
    31  	return us.key[us.seriesIDLen:]
    32  }
    33  
    34  func (us *userSeries) Reset(seriesID []byte, userID []byte) {
    35  	if us.key == nil {
    36  		us.key = make([]byte, 0, len(seriesID)+len(userID))
    37  	}
    38  	us.key = us.key[:0]
    39  	us.key = append(us.key, seriesID...)
    40  	us.key = append(us.key, userID...)
    41  	us.seriesIDLen = len(seriesID)
    42  }
    43  
    44  type userSeriesInfo struct {
    45  	userSeries
    46  	isDeleted bool
    47  	lbls      labels.Labels
    48  }
    49  
    50  type userSeriesMap map[string]userSeriesInfo
    51  
    52  func newUserSeriesMap() userSeriesMap {
    53  	return make(userSeriesMap)
    54  }
    55  
    56  func (u userSeriesMap) Add(seriesID []byte, userID []byte, lbls labels.Labels) {
    57  	us := newUserSeries(seriesID, userID)
    58  	if _, ok := u[us.Key()]; ok {
    59  		return
    60  	}
    61  
    62  	u[us.Key()] = userSeriesInfo{
    63  		userSeries: us,
    64  		isDeleted:  true,
    65  		lbls:       lbls,
    66  	}
    67  }
    68  
    69  // MarkSeriesNotDeleted is used to mark series not deleted when it still has some chunks left in the store
    70  func (u userSeriesMap) MarkSeriesNotDeleted(seriesID []byte, userID []byte) {
    71  	us := newUserSeries(seriesID, userID)
    72  	usi := u[us.Key()]
    73  	usi.isDeleted = false
    74  	u[us.Key()] = usi
    75  }
    76  
    77  func (u userSeriesMap) ForEach(callback func(info userSeriesInfo) error) error {
    78  	for _, v := range u {
    79  		if err := callback(v); err != nil {
    80  			return err
    81  		}
    82  	}
    83  	return nil
    84  }