From 49752e7854eebf4da972d2ea31d1d2fa32a5d409 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:00:02 +0000 Subject: [PATCH 1/6] fix: Continue accepting connections after yamux session EOFs --- internal/cmd/agent.go | 1 + wsnet/listen.go | 13 ++++++++++++- wsnet/listen_test.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/internal/cmd/agent.go b/internal/cmd/agent.go index 29f65b21..14bd11ab 100644 --- a/internal/cmd/agent.go +++ b/internal/cmd/agent.go @@ -84,6 +84,7 @@ coder agent start --coder-url https://my-coder.com --token xxxx-xxxx return xerrors.Errorf("listen: %w", err) } defer func() { + log.Info(ctx, "closing wsnet listener") err := listener.Close() if err != nil { log.Error(ctx, "close listener", slog.Error(err)) diff --git a/wsnet/listen.go b/wsnet/listen.go index 47ba808d..81b1078e 100644 --- a/wsnet/listen.go +++ b/wsnet/listen.go @@ -143,7 +143,11 @@ func (l *listener) dial(ctx context.Context) (<-chan error, error) { defer close(errCh) for { conn, err := session.Accept() + if errors.Is(err, io.EOF) { + continue + } if err != nil { + l.log.Error(ctx, "accept session", slog.Error(err)) errCh <- err break } @@ -457,6 +461,10 @@ func (l *listener) Close() error { l.connClosersMut.Lock() defer l.connClosersMut.Unlock() + if l.acceptError != nil { + l.log.Error(context.Background(), "closed with accept error", slog.Error(l.acceptError)) + } + select { case _, ok := <-l.closed: if !ok { @@ -471,7 +479,10 @@ func (l *listener) Close() error { // really matter if these fail to close. _ = connCloser.Close() } - return l.ws.Close(websocket.StatusNormalClosure, "") + // If this socket was already closed by something wrapping, it + // gives a false indication of the listener failing to close. + _ = l.ws.Close(websocket.StatusNormalClosure, "") + return nil } // Since this listener is bound to the WebSocket, we could diff --git a/wsnet/listen_test.go b/wsnet/listen_test.go index 78b56691..1d233973 100644 --- a/wsnet/listen_test.go +++ b/wsnet/listen_test.go @@ -8,6 +8,7 @@ import ( "time" "cdr.dev/slog/sloggers/slogtest" + "github.com/hashicorp/yamux" "github.com/stretchr/testify/require" "nhooyr.io/websocket" ) @@ -48,4 +49,35 @@ func TestListen(t *testing.T) { time.Sleep(connectionRetryInterval * 5) <-connCh }) + + t.Run("No close when yamux ends", func(t *testing.T) { + var ( + connCh = make(chan *websocket.Conn) + mux = http.NewServeMux() + ) + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + ws, err := websocket.Accept(w, r, nil) + if err != nil { + t.Error(err) + return + } + connCh <- ws + }) + + s := httptest.NewServer(mux) + defer s.Close() + + l, err := Listen(context.Background(), slogtest.Make(t, nil), s.URL, "") + require.NoError(t, err) + conn := <-connCh + + sess, err := yamux.Client(websocket.NetConn(context.Background(), conn, websocket.MessageBinary), yamux.DefaultConfig()) + require.NoError(t, err) + + err = sess.Close() + require.NoError(t, err) + + err = l.Close() + require.NoError(t, err) + }) } From 7293c8dabb4cd0ffa9d0d7c5df21a94aad9d264f Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:21:15 +0000 Subject: [PATCH 2/6] Add verbosity to timeout --- wsnet/dial_test.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wsnet/dial_test.go b/wsnet/dial_test.go index a9b09417..12584bb4 100644 --- a/wsnet/dial_test.go +++ b/wsnet/dial_test.go @@ -8,6 +8,7 @@ import ( "io" "net" "strconv" + "strings" "testing" "time" @@ -61,7 +62,10 @@ func TestDial(t *testing.T) { defer cancelFunc() dialer, err := DialWebsocket(ctx, connectAddr, nil, nil) require.True(t, errors.Is(err, context.DeadlineExceeded)) - require.Error(t, dialer.conn.Close(), "already wrote close") + require.Error(t, err) + err = dialer.conn.Close() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "already wrote close")) }) t.Run("Ping", func(t *testing.T) { From 1143e50faec169f12f68e29db435902631c769b6 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:26:42 +0000 Subject: [PATCH 3/6] Revert test --- wsnet/listen.go | 4 +--- wsnet/listen_test.go | 32 -------------------------------- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/wsnet/listen.go b/wsnet/listen.go index 81b1078e..f4d72f42 100644 --- a/wsnet/listen.go +++ b/wsnet/listen.go @@ -96,6 +96,7 @@ func Listen(ctx context.Context, log slog.Logger, broker string, turnProxyAuthTo _ = l.Close() break } + l.log.Info(ctx, "connected to broker") } }() return l, nil @@ -143,9 +144,6 @@ func (l *listener) dial(ctx context.Context) (<-chan error, error) { defer close(errCh) for { conn, err := session.Accept() - if errors.Is(err, io.EOF) { - continue - } if err != nil { l.log.Error(ctx, "accept session", slog.Error(err)) errCh <- err diff --git a/wsnet/listen_test.go b/wsnet/listen_test.go index 1d233973..78b56691 100644 --- a/wsnet/listen_test.go +++ b/wsnet/listen_test.go @@ -8,7 +8,6 @@ import ( "time" "cdr.dev/slog/sloggers/slogtest" - "github.com/hashicorp/yamux" "github.com/stretchr/testify/require" "nhooyr.io/websocket" ) @@ -49,35 +48,4 @@ func TestListen(t *testing.T) { time.Sleep(connectionRetryInterval * 5) <-connCh }) - - t.Run("No close when yamux ends", func(t *testing.T) { - var ( - connCh = make(chan *websocket.Conn) - mux = http.NewServeMux() - ) - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - ws, err := websocket.Accept(w, r, nil) - if err != nil { - t.Error(err) - return - } - connCh <- ws - }) - - s := httptest.NewServer(mux) - defer s.Close() - - l, err := Listen(context.Background(), slogtest.Make(t, nil), s.URL, "") - require.NoError(t, err) - conn := <-connCh - - sess, err := yamux.Client(websocket.NetConn(context.Background(), conn, websocket.MessageBinary), yamux.DefaultConfig()) - require.NoError(t, err) - - err = sess.Close() - require.NoError(t, err) - - err = l.Close() - require.NoError(t, err) - }) } From 9a145c6c33a69a04ae0fb764f66e6eb7d04fee5a Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:29:37 +0000 Subject: [PATCH 4/6] Revert test change --- wsnet/dial_test.go | 6 +----- wsnet/listen.go | 5 +---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/wsnet/dial_test.go b/wsnet/dial_test.go index 12584bb4..a9b09417 100644 --- a/wsnet/dial_test.go +++ b/wsnet/dial_test.go @@ -8,7 +8,6 @@ import ( "io" "net" "strconv" - "strings" "testing" "time" @@ -62,10 +61,7 @@ func TestDial(t *testing.T) { defer cancelFunc() dialer, err := DialWebsocket(ctx, connectAddr, nil, nil) require.True(t, errors.Is(err, context.DeadlineExceeded)) - require.Error(t, err) - err = dialer.conn.Close() - require.Error(t, err) - require.True(t, strings.Contains(err.Error(), "already wrote close")) + require.Error(t, dialer.conn.Close(), "already wrote close") }) t.Run("Ping", func(t *testing.T) { diff --git a/wsnet/listen.go b/wsnet/listen.go index f4d72f42..be55c6ad 100644 --- a/wsnet/listen.go +++ b/wsnet/listen.go @@ -477,10 +477,7 @@ func (l *listener) Close() error { // really matter if these fail to close. _ = connCloser.Close() } - // If this socket was already closed by something wrapping, it - // gives a false indication of the listener failing to close. - _ = l.ws.Close(websocket.StatusNormalClosure, "") - return nil + return l.ws.Close(websocket.StatusNormalClosure, "") } // Since this listener is bound to the WebSocket, we could From 6c00c381140b8a24c9137976e62f7db7097277af Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:54:45 +0000 Subject: [PATCH 5/6] Never exit when connection fails --- wsnet/listen.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/wsnet/listen.go b/wsnet/listen.go index be55c6ad..d652e0e5 100644 --- a/wsnet/listen.go +++ b/wsnet/listen.go @@ -71,7 +71,7 @@ func Listen(ctx context.Context, log slog.Logger, broker string, turnProxyAuthTo default: } - if errors.Is(err, io.EOF) || errors.Is(err, yamux.ErrKeepAliveTimeout) { + if err != nil { l.log.Warn(ctx, "disconnected from broker", slog.Error(err)) // If we hit an EOF, then the connection to the broker @@ -88,14 +88,10 @@ func Listen(ctx context.Context, log slog.Logger, broker string, turnProxyAuthTo if err == nil || errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { break } + l.log.Warn(ctx, "connecting to broker failed", slog.Error(err)) } ticker.Stop() } - if err != nil { - l.acceptError = err - _ = l.Close() - break - } l.log.Info(ctx, "connected to broker") } }() From 8bcea86f7825dbf671a7b41b09ba989dcf23a493 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Wed, 11 Aug 2021 00:58:04 +0000 Subject: [PATCH 6/6] Remove useless log --- wsnet/listen.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wsnet/listen.go b/wsnet/listen.go index d652e0e5..78002899 100644 --- a/wsnet/listen.go +++ b/wsnet/listen.go @@ -103,7 +103,6 @@ type listener struct { turnProxyAuthToken string log slog.Logger - acceptError error ws *websocket.Conn connClosers []io.Closer connClosersMut sync.Mutex @@ -141,7 +140,6 @@ func (l *listener) dial(ctx context.Context) (<-chan error, error) { for { conn, err := session.Accept() if err != nil { - l.log.Error(ctx, "accept session", slog.Error(err)) errCh <- err break } @@ -455,10 +453,6 @@ func (l *listener) Close() error { l.connClosersMut.Lock() defer l.connClosersMut.Unlock() - if l.acceptError != nil { - l.log.Error(context.Background(), "closed with accept error", slog.Error(l.acceptError)) - } - select { case _, ok := <-l.closed: if !ok { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy