diff --git a/coderd/tailnet.go b/coderd/tailnet.go index ca2a86d27f..c5b2345728 100644 --- a/coderd/tailnet.go +++ b/coderd/tailnet.go @@ -229,6 +229,10 @@ func (s *ServerTailnet) watchAgentUpdates() { err := s.conn.UpdateNodes(nodes, false) if err != nil { + if xerrors.Is(err, tailnet.ErrConnClosed) { + s.logger.Warn(context.Background(), "tailnet conn closed, exiting watchAgentUpdates", slog.Error(err)) + return + } s.logger.Error(context.Background(), "update node in server tailnet", slog.Error(err)) return } diff --git a/tailnet/conn.go b/tailnet/conn.go index f53040a48c..8808fab775 100644 --- a/tailnet/conn.go +++ b/tailnet/conn.go @@ -47,6 +47,8 @@ import ( "github.com/coder/coder/v2/cryptorand" ) +var ErrConnClosed = xerrors.New("connection closed") + const ( WorkspaceAgentSSHPort = 1 WorkspaceAgentReconnectingPTYPort = 2 @@ -496,7 +498,7 @@ func (c *Conn) UpdateNodes(nodes []*Node, replacePeers bool) error { defer c.mutex.Unlock() if c.isClosed() { - return xerrors.New("connection closed") + return ErrConnClosed } status := c.Status() @@ -590,7 +592,7 @@ func (c *Conn) RemovePeer(selector PeerSelector) (deleted bool, err error) { defer c.mutex.Unlock() if c.isClosed() { - return false, xerrors.New("connection closed") + return false, ErrConnClosed } deleted = false @@ -919,7 +921,7 @@ func (c *Conn) Listen(network, addr string) (net.Listener, error) { c.mutex.Lock() if c.isClosed() { c.mutex.Unlock() - return nil, xerrors.New("closed") + return nil, ErrConnClosed } if c.listeners == nil { c.listeners = map[listenKey]*listener{}