Skip to content

Commit 182a5fc

Browse files
authored
Merge pull request containerd#9657 from azr/azr/ctt-hlp-read-seeker
content: add a BlobReadSeeker to allow multipart blob uploads
2 parents 0730bb8 + bb9d923 commit 182a5fc

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

core/content/helpers.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package content
1818

1919
import (
20+
"bytes"
2021
"context"
2122
"errors"
2223
"fmt"
@@ -52,6 +53,31 @@ func NewReader(ra ReaderAt) io.Reader {
5253
return io.NewSectionReader(ra, 0, ra.Size())
5354
}
5455

56+
type nopCloserBytesReader struct {
57+
*bytes.Reader
58+
}
59+
60+
func (*nopCloserBytesReader) Close() error { return nil }
61+
62+
type nopCloserSectionReader struct {
63+
*io.SectionReader
64+
}
65+
66+
func (*nopCloserSectionReader) Close() error { return nil }
67+
68+
// BlobReadSeeker returns a read seeker for the blob from the provider.
69+
func BlobReadSeeker(ctx context.Context, provider Provider, desc ocispec.Descriptor) (io.ReadSeekCloser, error) {
70+
if int64(len(desc.Data)) == desc.Size && digest.FromBytes(desc.Data) == desc.Digest {
71+
return &nopCloserBytesReader{bytes.NewReader(desc.Data)}, nil
72+
}
73+
74+
ra, err := provider.ReaderAt(ctx, desc)
75+
if err != nil {
76+
return nil, err
77+
}
78+
return &nopCloserSectionReader{io.NewSectionReader(ra, 0, ra.Size())}, nil
79+
}
80+
5581
// ReadBlob retrieves the entire contents of the blob from the provider.
5682
//
5783
// Avoid using this for large blobs, such as layers.

0 commit comments

Comments
 (0)