Merge pull request #5140 from mxpv/reader

Add OpenReader to local store
This commit is contained in:
Derek McGowan 2021-03-08 13:13:10 -08:00 committed by GitHub
commit f6a07f4440
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 17 deletions

View File

@ -37,7 +37,7 @@ type Provider interface {
// ReaderAt only requires desc.Digest to be set. // ReaderAt only requires desc.Digest to be set.
// Other fields in the descriptor may be used internally for resolving // Other fields in the descriptor may be used internally for resolving
// the location of the actual data. // the location of the actual data.
ReaderAt(ctx context.Context, dec ocispec.Descriptor) (ReaderAt, error) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (ReaderAt, error)
} }
// Ingester writes content // Ingester writes content

View File

@ -18,6 +18,11 @@ package local
import ( import (
"os" "os"
"github.com/pkg/errors"
"github.com/containerd/containerd/content"
"github.com/containerd/containerd/errdefs"
) )
// readerat implements io.ReaderAt in a completely stateless manner by opening // readerat implements io.ReaderAt in a completely stateless manner by opening
@ -27,6 +32,29 @@ type sizeReaderAt struct {
fp *os.File fp *os.File
} }
// OpenReader creates ReaderAt from a file
func OpenReader(p string) (content.ReaderAt, error) {
fi, err := os.Stat(p)
if err != nil {
if !os.IsNotExist(err) {
return nil, err
}
return nil, errors.Wrap(errdefs.ErrNotFound, "blob not found")
}
fp, err := os.Open(p)
if err != nil {
if !os.IsNotExist(err) {
return nil, err
}
return nil, errors.Wrap(errdefs.ErrNotFound, "blob not found")
}
return sizeReaderAt{size: fi.Size(), fp: fp}, nil
}
func (ra sizeReaderAt) ReadAt(p []byte, offset int64) (int, error) { func (ra sizeReaderAt) ReadAt(p []byte, offset int64) (int, error) {
return ra.fp.ReadAt(p, offset) return ra.fp.ReadAt(p, offset)
} }

View File

@ -131,25 +131,13 @@ func (s *store) ReaderAt(ctx context.Context, desc ocispec.Descriptor) (content.
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "calculating blob path for ReaderAt") return nil, errors.Wrapf(err, "calculating blob path for ReaderAt")
} }
fi, err := os.Stat(p)
reader, err := OpenReader(p)
if err != nil { if err != nil {
if !os.IsNotExist(err) { return nil, errors.Wrapf(err, "blob %s expected at %s", desc.Digest, p)
return nil, err
} }
return nil, errors.Wrapf(errdefs.ErrNotFound, "blob %s expected at %s", desc.Digest, p) return reader, nil
}
fp, err := os.Open(p)
if err != nil {
if !os.IsNotExist(err) {
return nil, err
}
return nil, errors.Wrapf(errdefs.ErrNotFound, "blob %s expected at %s", desc.Digest, p)
}
return sizeReaderAt{size: fi.Size(), fp: fp}, nil
} }
// Delete removes a blob by its digest. // Delete removes a blob by its digest.