Merge pull request #5140 from mxpv/reader
Add OpenReader to local store
This commit is contained in:
commit
f6a07f4440
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
if err != nil {
|
|
||||||
if !os.IsNotExist(err) {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.Wrapf(errdefs.ErrNotFound, "blob %s expected at %s", desc.Digest, p)
|
reader, err := OpenReader(p)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "blob %s expected at %s", desc.Digest, p)
|
||||||
}
|
}
|
||||||
|
|
||||||
fp, err := os.Open(p)
|
return reader, nil
|
||||||
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.
|
||||||
|
Loading…
Reference in New Issue
Block a user