mirror of
https://github.com/containerd/containerd.git
synced 2026-06-30 19:58:29 +00:00
Merge pull request #11981 from cpuguy83/remote_readerat
Implement io.ReaderAt on docker fetch reader
This commit is contained in:
@@ -102,6 +102,36 @@ func (hrs *httpReadSeeker) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (hrs *httpReadSeeker) ReadAt(p []byte, offset int64) (n int, err error) {
|
||||
if hrs.closed {
|
||||
return 0, fmt.Errorf("httpReadSeeker.ReadAt: closed: %w", errdefs.ErrUnavailable)
|
||||
}
|
||||
|
||||
if offset < 0 {
|
||||
return 0, fmt.Errorf("httpReadSeeker.ReadAt: negative offset: %w", errdefs.ErrInvalidArgument)
|
||||
}
|
||||
|
||||
if hrs.size != -1 && offset >= hrs.size {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
if hrs.open == nil {
|
||||
return 0, fmt.Errorf("httpReadSeeker.ReadAt: cannot open: %w", errdefs.ErrNotImplemented)
|
||||
}
|
||||
|
||||
rc, err := hrs.open(offset)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("httpReadSeeker.ReadAt: failed to open at offset %d: %w", offset, err)
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := rc.Close(); closeErr != nil {
|
||||
log.L.WithError(closeErr).Error("httpReadSeeker.ReadAt: failed to close ReadCloser")
|
||||
}
|
||||
}()
|
||||
|
||||
return io.ReadFull(rc, p)
|
||||
}
|
||||
|
||||
func (hrs *httpReadSeeker) Seek(offset int64, whence int) (int64, error) {
|
||||
if hrs.closed {
|
||||
return 0, fmt.Errorf("Fetcher.Seek: closed: %w", errdefs.ErrUnavailable)
|
||||
|
||||
Reference in New Issue
Block a user