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 }