diff --git a/daemon/health.go b/daemon/health.go index 9f7c76ee14..87d6a6a4e3 100644 --- a/daemon/health.go +++ b/daemon/health.go @@ -5,6 +5,7 @@ import ( "fmt" "runtime" "strings" + "sync" "time" "golang.org/x/net/context" @@ -271,11 +272,15 @@ func (d *Daemon) stopHealthchecks(c *container.Container) { // Buffer up to maxOutputLen bytes. Further data is discarded. type limitedBuffer struct { buf bytes.Buffer + mu sync.Mutex truncated bool // indicates that data has been lost } // Append to limitedBuffer while there is room. func (b *limitedBuffer) Write(data []byte) (int, error) { + b.mu.Lock() + defer b.mu.Unlock() + bufLen := b.buf.Len() dataLen := len(data) keep := min(maxOutputLen-bufLen, dataLen) @@ -290,6 +295,9 @@ func (b *limitedBuffer) Write(data []byte) (int, error) { // The contents of the buffer, with "..." appended if it overflowed. func (b *limitedBuffer) String() string { + b.mu.Lock() + defer b.mu.Unlock() + out := b.buf.String() if b.truncated { out = out + "..."