Merge pull request #17291 from aaronlehmann/buffer-compression

Add a buffered Writer between layer compression and layer upload
This commit is contained in:
Tibor Vass 2015-10-23 13:52:08 -04:00
commit f7bdcea529
1 changed files with 9 additions and 1 deletions

View File

@ -1,6 +1,7 @@
package graph package graph
import ( import (
"bufio"
"compress/gzip" "compress/gzip"
"fmt" "fmt"
"io" "io"
@ -20,6 +21,8 @@ import (
"golang.org/x/net/context" "golang.org/x/net/context"
) )
const compressionBufSize = 32768
type v2Pusher struct { type v2Pusher struct {
*TagStore *TagStore
endpoint registry.APIEndpoint endpoint registry.APIEndpoint
@ -259,13 +262,18 @@ func (p *v2Pusher) pushV2Image(bs distribution.BlobService, img *image.Image) (d
// we must make sure the ReadFrom is used, not Write. Using Write would // we must make sure the ReadFrom is used, not Write. Using Write would
// send a PATCH request for every Write call. // send a PATCH request for every Write call.
pipeReader, pipeWriter := io.Pipe() pipeReader, pipeWriter := io.Pipe()
compressor := gzip.NewWriter(io.MultiWriter(pipeWriter, digester.Hash())) // Use a bufio.Writer to avoid excessive chunking in HTTP request.
bufWriter := bufio.NewWriterSize(io.MultiWriter(pipeWriter, digester.Hash()), compressionBufSize)
compressor := gzip.NewWriter(bufWriter)
go func() { go func() {
_, err := io.Copy(compressor, reader) _, err := io.Copy(compressor, reader)
if err == nil { if err == nil {
err = compressor.Close() err = compressor.Close()
} }
if err == nil {
err = bufWriter.Flush()
}
if err != nil { if err != nil {
pipeWriter.CloseWithError(err) pipeWriter.CloseWithError(err)
} else { } else {