瀏覽代碼

Protect jsonfilelog writes with mutex

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Alexander Morozov 10 年之前
父節點
當前提交
bd8661e8fa
共有 1 個文件被更改,包括 11 次插入2 次删除
  1. 11 2
      daemon/logger/jsonfilelog/jsonfilelog.go

+ 11 - 2
daemon/logger/jsonfilelog/jsonfilelog.go

@@ -3,6 +3,7 @@ package jsonfilelog
 import (
 	"bytes"
 	"os"
+	"sync"
 
 	"github.com/docker/docker/daemon/logger"
 	"github.com/docker/docker/pkg/jsonlog"
@@ -12,7 +13,8 @@ import (
 // JSON objects to file
 type JSONFileLogger struct {
 	buf *bytes.Buffer
-	f   *os.File // store for closing
+	f   *os.File   // store for closing
+	mu  sync.Mutex // protects buffer
 }
 
 // New creates new JSONFileLogger which writes to filename
@@ -29,13 +31,20 @@ func New(filename string) (logger.Logger, error) {
 
 // Log converts logger.Message to jsonlog.JSONLog and serializes it to file
 func (l *JSONFileLogger) Log(msg *logger.Message) error {
+	l.mu.Lock()
+	defer l.mu.Unlock()
 	err := (&jsonlog.JSONLog{Log: string(msg.Line) + "\n", Stream: msg.Source, Created: msg.Timestamp}).MarshalJSONBuf(l.buf)
 	if err != nil {
 		return err
 	}
 	l.buf.WriteByte('\n')
 	_, err = l.buf.WriteTo(l.f)
-	return err
+	if err != nil {
+		// this buffer is screwed, replace it with another to avoid races
+		l.buf = bytes.NewBuffer(nil)
+		return err
+	}
+	return nil
 }
 
 // Close closes underlying file