From fcb64b6e08b575674942010514400bc485af4e92 Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Mon, 21 Nov 2016 14:24:53 -0500 Subject: [PATCH] re-vendor syslog log driver Signed-off-by: Brian Goff (cherry picked from commit 00caf03132a1bf1a2a7a389c5f23d6fc81f2bc0b) Signed-off-by: Victor Vieux --- vendor.conf | 2 +- vendor/github.com/RackSec/srslog/srslog.go | 5 +- vendor/github.com/RackSec/srslog/writer.go | 73 ++++++++++++++-------- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/vendor.conf b/vendor.conf index 71f0d099e0..598d1ba411 100644 --- a/vendor.conf +++ b/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 diff --git a/vendor/github.com/RackSec/srslog/srslog.go b/vendor/github.com/RackSec/srslog/srslog.go index 4469d720c3..b404dff7c5 100644 --- a/vendor/github.com/RackSec/srslog/srslog.go +++ b/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 } diff --git a/vendor/github.com/RackSec/srslog/writer.go b/vendor/github.com/RackSec/srslog/writer.go index fdecaf61f6..ce3d867635 100644 --- a/vendor/github.com/RackSec/srslog/writer.go +++ b/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 }