github.com/grafana/pyroscope@v1.18.0/pkg/objstore/providers/filesystem/bucket_client.go (about) 1 package filesystem 2 3 import ( 4 "context" 5 "os" 6 "path/filepath" 7 8 "github.com/thanos-io/objstore" 9 "github.com/thanos-io/objstore/providers/filesystem" 10 11 phlareobjstore "github.com/grafana/pyroscope/pkg/objstore" 12 ) 13 14 type Bucket struct { 15 objstore.Bucket 16 rootDir string 17 } 18 19 // NewBucket returns a new filesystem.Bucket. 20 func NewBucket(rootDir string, middlewares ...func(objstore.Bucket) (objstore.Bucket, error)) (*Bucket, error) { 21 var ( 22 b objstore.Bucket 23 err error 24 ) 25 b, err = filesystem.NewBucket(rootDir) 26 if err != nil { 27 return nil, err 28 } 29 for _, wrap := range middlewares { 30 b, err = wrap(b) 31 if err != nil { 32 return nil, err 33 } 34 } 35 return &Bucket{Bucket: b, rootDir: rootDir}, nil 36 } 37 38 func (b *Bucket) ReaderAt(ctx context.Context, filename string) (phlareobjstore.ReaderAtCloser, error) { 39 f, err := os.Open(filepath.Join(b.rootDir, filename)) 40 if err != nil { 41 return nil, err 42 } 43 44 return &FileReaderAt{File: f}, nil 45 } 46 47 // ReaderWithExpectedErrs implements objstore.Bucket. 48 func (b *Bucket) ReaderWithExpectedErrs(fn phlareobjstore.IsOpFailureExpectedFunc) phlareobjstore.BucketReader { 49 return b.WithExpectedErrs(fn) 50 } 51 52 // WithExpectedErrs implements objstore.Bucket. 53 func (b *Bucket) WithExpectedErrs(fn phlareobjstore.IsOpFailureExpectedFunc) phlareobjstore.Bucket { 54 if ib, ok := b.Bucket.(phlareobjstore.InstrumentedBucket); ok { 55 return &Bucket{ 56 rootDir: b.rootDir, 57 Bucket: ib.WithExpectedErrs(fn), 58 } 59 } 60 if ib, ok := b.Bucket.(objstore.InstrumentedBucket); ok { 61 return &Bucket{ 62 rootDir: b.rootDir, 63 Bucket: ib.WithExpectedErrs(func(err error) bool { return fn(err) }), 64 } 65 } 66 67 return b 68 } 69 70 type FileReaderAt struct { 71 *os.File 72 } 73 74 func (b *FileReaderAt) ReadAt(p []byte, off int64) (n int, err error) { 75 return b.File.ReadAt(p, off) 76 }