From 7ef34407509fa76e3ead12a20c8b731f434e1971 Mon Sep 17 00:00:00 2001 From: unclejack Date: Sat, 6 Sep 2014 15:29:19 +0300 Subject: [PATCH] pkg/tarsum: add dynamic buffer sizing This commit makes tarsum buffer allocation dynamic. This change is required to avoid allocating memory excessively after the archive buffering changes. Docker-DCO-1.1-Signed-off-by: Cristian Staretu (github: unclejack) --- pkg/tarsum/tarsum.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/pkg/tarsum/tarsum.go b/pkg/tarsum/tarsum.go index 05b9ef4e2c..0041389ee5 100644 --- a/pkg/tarsum/tarsum.go +++ b/pkg/tarsum/tarsum.go @@ -16,6 +16,12 @@ import ( "github.com/docker/docker/pkg/log" ) +const ( + buf8K = 8 * 1024 + buf16K = 16 * 1024 + buf32K = 32 * 1024 +) + type TarSum struct { io.Reader tarR *tar.Reader @@ -23,7 +29,7 @@ type TarSum struct { gz writeCloseFlusher bufTar *bytes.Buffer bufGz *bytes.Buffer - bufData [8192]byte + bufData []byte h hash.Hash sums map[string]string currentFile string @@ -93,12 +99,19 @@ func (ts *TarSum) Read(buf []byte) (int, error) { if ts.finished { return ts.bufGz.Read(buf) } - var buf2 []byte - if len(buf) > 8192 { - buf2 = make([]byte, len(buf), cap(buf)) - } else { - buf2 = ts.bufData[:len(buf)-1] + if ts.bufData == nil { + switch { + case len(buf) <= buf8K: + ts.bufData = make([]byte, buf8K) + case len(buf) <= buf16K: + ts.bufData = make([]byte, buf16K) + case len(buf) <= buf32K: + ts.bufData = make([]byte, buf32K) + default: + ts.bufData = make([]byte, len(buf)) + } } + buf2 := ts.bufData[:len(buf)-1] n, err := ts.tarR.Read(buf2) if err != nil {