ソースを参照

re-vendor syslog log driver

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Brian Goff 8 年 前
コミット
00caf03132

+ 1 - 1
vendor.conf

@@ -19,7 +19,7 @@ golang.org/x/sys 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9
 github.com/docker/go-units 8a7beacffa3009a9ac66bad506b18ffdd110cf97
 github.com/docker/go-connections f512407a188ecb16f31a33dbc9c4e4814afc1b03
 
-github.com/RackSec/srslog 365bf33cd9acc21ae1c355209865f17228ca534e
+github.com/RackSec/srslog 456df3a81436d29ba874f3590eeeee25d666f8a5
 github.com/imdario/mergo 0.2.1
 
 #get libnetwork packages

+ 1 - 4
vendor/github.com/RackSec/srslog/srslog.go

@@ -77,10 +77,7 @@ func DialWithTLSConfig(network, raddr string, priority Priority, tag string, tls
 		tlsConfig: tlsConfig,
 	}
 
-	w.Lock()
-	defer w.Unlock()
-
-	err := w.connect()
+	_, err := w.connect()
 	if err != nil {
 		return nil, err
 	}

+ 47 - 26
vendor/github.com/RackSec/srslog/writer.go

@@ -8,8 +8,6 @@ import (
 
 // A Writer is a connection to a syslog server.
 type Writer struct {
-	sync.Mutex // guards conn
-
 	priority  Priority
 	tag       string
 	hostname  string
@@ -19,28 +17,48 @@ type Writer struct {
 	framer    Framer
 	formatter Formatter
 
+	mu   sync.RWMutex // guards conn
 	conn serverConn
 }
 
+// getConn provides access to the internal conn, protected by a mutex. The
+// conn is threadsafe, so it can be used while unlocked, but we want to avoid
+// race conditions on grabbing a reference to it.
+func (w *Writer) getConn() serverConn {
+	w.mu.RLock()
+	conn := w.conn
+	w.mu.RUnlock()
+	return conn
+}
+
+// setConn updates the internal conn, protected by a mutex.
+func (w *Writer) setConn(c serverConn) {
+	w.mu.Lock()
+	w.conn = c
+	w.mu.Unlock()
+}
+
 // connect makes a connection to the syslog server.
-// It must be called with w.mu held.
-func (w *Writer) connect() (err error) {
-	if w.conn != nil {
+func (w *Writer) connect() (serverConn, error) {
+	conn := w.getConn()
+	if conn != nil {
 		// ignore err from close, it makes sense to continue anyway
-		w.conn.close()
-		w.conn = nil
+		conn.close()
+		w.setConn(nil)
 	}
 
-	var conn serverConn
 	var hostname string
+	var err error
 	dialer := w.getDialer()
 	conn, hostname, err = dialer.Call()
 	if err == nil {
-		w.conn = conn
+		w.setConn(conn)
 		w.hostname = hostname
-	}
 
-	return
+		return conn, nil
+	} else {
+		return nil, err
+	}
 }
 
 // SetFormatter changes the formatter function for subsequent messages.
@@ -59,14 +77,17 @@ func (w *Writer) Write(b []byte) (int, error) {
 	return w.writeAndRetry(w.priority, string(b))
 }
 
+// WriteWithPriority sends a log message with a custom priority
+func (w *Writer) WriteWithPriority(p Priority, b []byte) (int, error) {
+	return w.writeAndRetry(p, string(b))
+}
+
 // Close closes a connection to the syslog daemon.
 func (w *Writer) Close() error {
-	w.Lock()
-	defer w.Unlock()
-
-	if w.conn != nil {
-		err := w.conn.close()
-		w.conn = nil
+	conn := w.getConn()
+	if conn != nil {
+		err := conn.close()
+		w.setConn(nil)
 		return err
 	}
 	return nil
@@ -131,29 +152,29 @@ func (w *Writer) Debug(m string) (err error) {
 func (w *Writer) writeAndRetry(p Priority, s string) (int, error) {
 	pr := (w.priority & facilityMask) | (p & severityMask)
 
-	w.Lock()
-	defer w.Unlock()
-
-	if w.conn != nil {
-		if n, err := w.write(pr, s); err == nil {
+	conn := w.getConn()
+	if conn != nil {
+		if n, err := w.write(conn, pr, s); err == nil {
 			return n, err
 		}
 	}
-	if err := w.connect(); err != nil {
+
+	var err error
+	if conn, err = w.connect(); err != nil {
 		return 0, err
 	}
-	return w.write(pr, s)
+	return w.write(conn, pr, s)
 }
 
 // write generates and writes a syslog formatted string. It formats the
 // message based on the current Formatter and Framer.
-func (w *Writer) write(p Priority, msg string) (int, error) {
+func (w *Writer) write(conn serverConn, p Priority, msg string) (int, error) {
 	// ensure it ends in a \n
 	if !strings.HasSuffix(msg, "\n") {
 		msg += "\n"
 	}
 
-	err := w.conn.writeString(w.framer, w.formatter, p, w.hostname, w.tag, msg)
+	err := conn.writeString(w.framer, w.formatter, p, w.hostname, w.tag, msg)
 	if err != nil {
 		return 0, err
 	}