github.com/grafana/pyroscope@v1.18.0/pkg/objstore/parquet/file.go (about) 1 package parquet 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/parquet-go/parquet-go" 8 9 "github.com/grafana/pyroscope/pkg/objstore" 10 "github.com/grafana/pyroscope/pkg/phlaredb/block" 11 ) 12 13 type File struct { 14 *parquet.File 15 reader objstore.ReaderAtCloser 16 meta block.File 17 } 18 19 func (f *File) Open(ctx context.Context, b objstore.BucketReader, meta block.File, options ...parquet.FileOption) error { 20 if meta.SizeBytes == 0 { 21 attrs, err := b.Attributes(ctx, meta.RelPath) 22 if err != nil { 23 return fmt.Errorf("getting attributes: %w", err) 24 } 25 meta.SizeBytes = uint64(attrs.Size) 26 } 27 var err error 28 // the same reader is used to serve all requests, so we pass context.Background() here 29 ra, err := OptimizedBucketReaderAt(b, context.Background(), meta) 30 if err != nil { 31 return fmt.Errorf("creating reader: %w", err) 32 } 33 f.reader = ra 34 ora := ra.(*optimizedReaderAt) 35 36 // after finishing opening, clear footer cache 37 defer ora.clearFooterCache() 38 39 // first try to open file, this is required otherwise OpenFile panics 40 f.File, err = parquet.OpenFile(f.reader, int64(meta.SizeBytes), 41 parquet.SkipPageIndex(true), 42 parquet.SkipBloomFilters(true)) 43 if err != nil { 44 return err 45 } 46 47 // now open it for real 48 f.File, err = parquet.OpenFile(f.reader, int64(meta.SizeBytes), 49 options..., 50 ) 51 return err 52 } 53 54 func (f *File) Close() (err error) { 55 if f.reader != nil { 56 return f.reader.Close() 57 } 58 return nil 59 } 60 61 func (f *File) Path() string { return f.meta.RelPath }