Explorar o código

Merge pull request #26596 from drakenator/26384-healthcheck-race

Prevent stdout / stderr race condition in limitedBuffer.
Tõnis Tiigi %!s(int64=8) %!d(string=hai) anos
pai
achega
4c82365cdb
Modificáronse 1 ficheiros con 8 adicións e 0 borrados
  1. 8 0
      daemon/health.go

+ 8 - 0
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 + "..."