github.com/grafana/pyroscope@v1.18.0/pkg/phlaredb/block/list.go (about)

     1  package block
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"sort"
     7  	"time"
     8  
     9  	"github.com/oklog/ulid/v2"
    10  )
    11  
    12  func ListBlocks(path string, ulidMinTime time.Time) (map[ulid.ULID]*Meta, error) {
    13  	result := make(map[ulid.ULID]*Meta)
    14  	entries, err := os.ReadDir(path)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  	for _, entry := range entries {
    19  		if !entry.IsDir() {
    20  			continue
    21  		}
    22  		path := filepath.Join(path, entry.Name())
    23  		if _, ok := IsBlockDir(path); !ok {
    24  			continue
    25  		}
    26  		meta, _, err := MetaFromDir(path)
    27  		if err != nil {
    28  			return nil, err
    29  		}
    30  		if !ulidMinTime.IsZero() && ulid.Time(meta.ULID.Time()).Before(ulidMinTime) {
    31  			continue
    32  		}
    33  		result[meta.ULID] = meta
    34  	}
    35  
    36  	return result, nil
    37  }
    38  
    39  func SortBlocks(metas map[ulid.ULID]*Meta) []*Meta {
    40  	var blocks []*Meta
    41  
    42  	for _, b := range metas {
    43  		blocks = append(blocks, b)
    44  	}
    45  
    46  	sort.Slice(blocks, func(i, j int) bool {
    47  		// By min-time
    48  		if blocks[i].MinTime != blocks[j].MinTime {
    49  			return blocks[i].MinTime < blocks[j].MinTime
    50  		}
    51  
    52  		// Duration
    53  		duri := blocks[i].MaxTime - blocks[i].MinTime
    54  		durj := blocks[j].MaxTime - blocks[j].MinTime
    55  		if duri != durj {
    56  			return duri < durj
    57  		}
    58  
    59  		// ULID time.
    60  		return blocks[i].ULID.Time() < blocks[j].ULID.Time()
    61  	})
    62  	return blocks
    63  }