Have NewReadCloserWrapper pass through io.WriterTo

If the underlying io.Reader implements WriteTo, make
the wrapped ReadCloser implement it as well.

This causes the values returned by pkg/archive.DecompressStream
to implement WriteTo (for gzip and zstd, not bzip2 and xz),
and that in turn eliminates a 32kB memory allocation when
decompressing layers during pull.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
Miloslav Trmač 2021-08-20 17:07:07 +02:00
parent e279f32dfe
commit 1105c5c6da
1 changed files with 17 additions and 0 deletions

View File

@ -17,8 +17,25 @@ func (r *readCloserWrapper) Close() error {
return r.closer()
}
type readWriteToCloserWrapper struct {
io.Reader
io.WriterTo
closer func() error
}
func (r *readWriteToCloserWrapper) Close() error {
return r.closer()
}
// NewReadCloserWrapper returns a new io.ReadCloser.
func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser {
if wt, ok := r.(io.WriterTo); ok {
return &readWriteToCloserWrapper{
Reader: r,
WriterTo: wt,
closer: closer,
}
}
return &readCloserWrapper{
Reader: r,
closer: closer,