From c1477db04fc32621652cf6a8fd2976b6bbf2066e Mon Sep 17 00:00:00 2001 From: unclejack Date: Mon, 29 Jun 2015 23:27:54 +0300 Subject: [PATCH] daemon: lower allocations Signed-off-by: Cristian Staretu --- daemon/exec.go | 3 ++- daemon/execdriver/native/driver.go | 5 +++-- pkg/pools/pools.go | 8 ++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/daemon/exec.go b/daemon/exec.go index 2b28ba1eef..26b92fbfb8 100644 --- a/daemon/exec.go +++ b/daemon/exec.go @@ -11,6 +11,7 @@ import ( "github.com/docker/docker/daemon/execdriver" "github.com/docker/docker/pkg/broadcastwriter" "github.com/docker/docker/pkg/ioutils" + "github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/runconfig" ) @@ -183,7 +184,7 @@ func (d *Daemon) ContainerExecStart(execName string, stdin io.ReadCloser, stdout go func() { defer w.Close() defer logrus.Debugf("Closing buffered stdin pipe") - io.Copy(w, stdin) + pools.Copy(w, stdin) }() cStdin = r } diff --git a/daemon/execdriver/native/driver.go b/daemon/execdriver/native/driver.go index da13c2b165..2017a9c65c 100644 --- a/daemon/execdriver/native/driver.go +++ b/daemon/execdriver/native/driver.go @@ -16,6 +16,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/docker/daemon/execdriver" "github.com/docker/docker/pkg/parsers" + "github.com/docker/docker/pkg/pools" "github.com/docker/docker/pkg/reexec" sysinfo "github.com/docker/docker/pkg/system" "github.com/docker/docker/pkg/term" @@ -394,12 +395,12 @@ func (t *TtyConsole) AttachPipes(pipes *execdriver.Pipes) error { defer wb.CloseWriters() } - io.Copy(pipes.Stdout, t.console) + pools.Copy(pipes.Stdout, t.console) }() if pipes.Stdin != nil { go func() { - io.Copy(t.console, pipes.Stdin) + pools.Copy(t.console, pipes.Stdin) pipes.Stdin.Close() }() diff --git a/pkg/pools/pools.go b/pkg/pools/pools.go index f366fa67a7..c34ea92e4d 100644 --- a/pkg/pools/pools.go +++ b/pkg/pools/pools.go @@ -57,6 +57,14 @@ func (bufPool *BufioReaderPool) Put(b *bufio.Reader) { bufPool.pool.Put(b) } +// Copy is a convenience wrapper which uses a buffer to avoid allocation in io.Copy +func Copy(dst io.Writer, src io.Reader) (written int64, err error) { + buf := BufioReader32KPool.Get(src) + written, err = io.Copy(dst, buf) + BufioReader32KPool.Put(buf) + return +} + // NewReadCloserWrapper returns a wrapper which puts the bufio.Reader back // into the pool and closes the reader if it's an io.ReadCloser. func (bufPool *BufioReaderPool) NewReadCloserWrapper(buf *bufio.Reader, r io.Reader) io.ReadCloser {