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 }