From 8875b2fa0f8352659e2cf1b04446b07d6bedd8eb Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Tue, 3 May 2022 08:28:24 -0500 Subject: [PATCH 1/3] fix: force logs to flush on close in peer.(*Conn) --- peer/conn.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/peer/conn.go b/peer/conn.go index 662a00f93a706..90a39beb76710 100644 --- a/peer/conn.go +++ b/peer/conn.go @@ -110,7 +110,7 @@ type Conn struct { closedRTCMutex sync.Mutex closedICE chan struct{} closedICEMutex sync.Mutex - closeMutex sync.Mutex + closeMutex sync.RWMutex closeError error dcOpenChannel chan *webrtc.DataChannel @@ -143,10 +143,15 @@ type Conn struct { } func (c *Conn) logger() slog.Logger { + // The logger gets swapped + c.closeMutex.RLock() + defer c.closeMutex.RUnlock() + log, valid := c.loggerValue.Load().(slog.Logger) if !valid { return slog.Logger{} } + return log } @@ -566,11 +571,14 @@ func (c *Conn) isClosed() bool { func (c *Conn) CloseWithError(err error) error { c.closeMutex.Lock() defer c.closeMutex.Unlock() + if c.isClosed() { return c.closeError } - c.logger().Debug(context.Background(), "closing conn with error", slog.Error(err)) + logger := c.logger() + + logger.Debug(context.Background(), "closing conn with error", slog.Error(err)) if err == nil { c.closeError = ErrClosed } else { @@ -588,11 +596,11 @@ func (c *Conn) CloseWithError(err error) error { // Waiting for pion/webrtc to report closed state on both of these // ensures no goroutine leaks. if c.rtc.ConnectionState() != webrtc.PeerConnectionStateNew { - c.logger().Debug(context.Background(), "waiting for rtc connection close...") + logger.Debug(context.Background(), "waiting for rtc connection close...") <-c.closedRTC } if c.rtc.ICEConnectionState() != webrtc.ICEConnectionStateNew { - c.logger().Debug(context.Background(), "waiting for ice connection close...") + logger.Debug(context.Background(), "waiting for ice connection close...") <-c.closedICE } @@ -600,9 +608,11 @@ func (c *Conn) CloseWithError(err error) error { // All logging, goroutines, and async functionality is cleaned up after this. c.dcClosedWaitGroup.Wait() - c.logger().Debug(context.Background(), "closed") // Disable logging! c.loggerValue.Store(slog.Logger{}) + logger.Sync() + + logger.Debug(context.Background(), "closed") close(c.closed) return err } From f38c771c84c4d04d450392ab5f88037c9ae670e7 Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Tue, 3 May 2022 08:29:47 -0500 Subject: [PATCH 2/3] fixup! fix: force logs to flush on close in peer.(*Conn) --- peer/conn.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/peer/conn.go b/peer/conn.go index 90a39beb76710..383a05de957f3 100644 --- a/peer/conn.go +++ b/peer/conn.go @@ -143,10 +143,6 @@ type Conn struct { } func (c *Conn) logger() slog.Logger { - // The logger gets swapped - c.closeMutex.RLock() - defer c.closeMutex.RUnlock() - log, valid := c.loggerValue.Load().(slog.Logger) if !valid { return slog.Logger{} From 4e9dab49b1cd2ad3980e78141c1047974c8b326c Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Tue, 3 May 2022 08:30:06 -0500 Subject: [PATCH 3/3] fixup! fix: force logs to flush on close in peer.(*Conn) --- peer/conn.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/peer/conn.go b/peer/conn.go index 383a05de957f3..e9126443b8eca 100644 --- a/peer/conn.go +++ b/peer/conn.go @@ -110,7 +110,7 @@ type Conn struct { closedRTCMutex sync.Mutex closedICE chan struct{} closedICEMutex sync.Mutex - closeMutex sync.RWMutex + closeMutex sync.Mutex closeError error dcOpenChannel chan *webrtc.DataChannel