diff --git a/statsd/pipe_windows.go b/statsd/pipe_windows.go index c27434cc..75b5ed6d 100644 --- a/statsd/pipe_windows.go +++ b/statsd/pipe_windows.go @@ -63,6 +63,13 @@ func (p *pipeWriter) ensureConnection() (net.Conn, error) { } func (p *pipeWriter) Close() error { + p.mu.RLock() + defer p.mu.RUnlock() + // conn is nil if no write ever established a connection + if p.conn == nil { + return nil + } + return p.conn.Close() } diff --git a/statsd/pipe_windows_test.go b/statsd/pipe_windows_test.go index e2853141..10f8c264 100644 --- a/statsd/pipe_windows_test.go +++ b/statsd/pipe_windows_test.go @@ -83,6 +83,19 @@ func TestPipeWriterEnv(t *testing.T) { assert.Equal(t, got, "metric:1|g|#key:val\n") } +// TestPipeWriterCloseWithoutWrite ensures closing a writer that never +// established a connection does not panic. newWindowsPipeWriter defers +// connecting to the first write, so conn is nil until then. +func TestPipeWriterCloseWithoutWrite(t *testing.T) { + pipepath, f, _ := createNamedPipe(t) + defer os.Remove(f.Name()) + + w, err := newWindowsPipeWriter(pipepath, defaultWriteTimeout) + require.Nil(t, err) + + assert.Nil(t, w.Close()) +} + func TestPipeWriterReconnect(t *testing.T) { pipepath, f, ln := createNamedPipe(t) defer os.Remove(f.Name())