Merge pull request #4653 from amrmahdi/amrh/optimize-content-transfer
Improve image pull performance from http 1.1 container registries
This commit is contained in:
commit
cc3785c815
@ -229,9 +229,47 @@ func seekReader(r io.Reader, offset, size int64) (io.Reader, error) {
|
|||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copyWithBuffer is very similar to io.CopyBuffer https://golang.org/pkg/io/#CopyBuffer
|
||||||
|
// but instead of using Read to read from the src, we use ReadAtLeast to make sure we have
|
||||||
|
// a full buffer before we do a write operation to dst to reduce overheads associated
|
||||||
|
// with the write operations of small buffers.
|
||||||
func copyWithBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
|
func copyWithBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
|
||||||
buf := bufPool.Get().(*[]byte)
|
// If the reader has a WriteTo method, use it to do the copy.
|
||||||
written, err = io.CopyBuffer(dst, src, *buf)
|
// Avoids an allocation and a copy.
|
||||||
bufPool.Put(buf)
|
if wt, ok := src.(io.WriterTo); ok {
|
||||||
|
return wt.WriteTo(dst)
|
||||||
|
}
|
||||||
|
// Similarly, if the writer has a ReadFrom method, use it to do the copy.
|
||||||
|
if rt, ok := dst.(io.ReaderFrom); ok {
|
||||||
|
return rt.ReadFrom(src)
|
||||||
|
}
|
||||||
|
bufRef := bufPool.Get().(*[]byte)
|
||||||
|
defer bufPool.Put(bufRef)
|
||||||
|
buf := *bufRef
|
||||||
|
for {
|
||||||
|
nr, er := io.ReadAtLeast(src, buf, len(buf))
|
||||||
|
if nr > 0 {
|
||||||
|
nw, ew := dst.Write(buf[0:nr])
|
||||||
|
if nw > 0 {
|
||||||
|
written += int64(nw)
|
||||||
|
}
|
||||||
|
if ew != nil {
|
||||||
|
err = ew
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if nr != nw {
|
||||||
|
err = io.ErrShortWrite
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if er != nil {
|
||||||
|
// If an EOF happens after reading fewer than the requested bytes,
|
||||||
|
// ReadAtLeast returns ErrUnexpectedEOF.
|
||||||
|
if er != io.EOF && er != io.ErrUnexpectedEOF {
|
||||||
|
err = er
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user