From 8ad3b93fed1bdd601993b73a600f4d176f755c68 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Wed, 2 Aug 2023 02:07:45 +0000 Subject: [PATCH 1/3] fix: avoid infinite loop in agent derp-map --- codersdk/agentsdk/agentsdk.go | 7 ++++--- enterprise/coderd/coderd.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/codersdk/agentsdk/agentsdk.go b/codersdk/agentsdk/agentsdk.go index f4b114438c010..e8cde1a65b90e 100644 --- a/codersdk/agentsdk/agentsdk.go +++ b/codersdk/agentsdk/agentsdk.go @@ -211,13 +211,11 @@ func (c *Client) DERPMapUpdates(ctx context.Context) (<-chan DERPMapUpdate, io.C if err != nil { update.Err = err update.DERPMap = nil - return } err = c.rewriteDerpMap(update.DERPMap) if err != nil { update.Err = err update.DERPMap = nil - return } select { @@ -225,14 +223,17 @@ func (c *Client) DERPMapUpdates(ctx context.Context) (<-chan DERPMapUpdate, io.C case <-ctx.Done(): return } + if update.Err != nil { + return + } } }() return updates, &closer{ closeFunc: func() error { cancelFunc() - _ = wsNetConn.Close() <-pingClosed + _ = conn.Close(websocket.StatusGoingAway, "Listen closed") <-updatesClosed return nil }, diff --git a/enterprise/coderd/coderd.go b/enterprise/coderd/coderd.go index fcd9b5a6550d2..5487cb76d93d5 100644 --- a/enterprise/coderd/coderd.go +++ b/enterprise/coderd/coderd.go @@ -768,7 +768,7 @@ func derpMapper(logger slog.Logger, cfg *codersdk.DeploymentValues, proxyHealth EmbeddedRelay: false, RegionID: regionID, RegionCode: regionCode, - RegionName: status.Proxy.Name, + RegionName: status.Proxy.DisplayName, Nodes: nodes, } } From c5e8083766a56444584d2ab585d5bd596c4bee45 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Wed, 2 Aug 2023 02:09:21 +0000 Subject: [PATCH 2/3] fixup! fix: avoid infinite loop in agent derp-map --- enterprise/coderd/coderd.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/enterprise/coderd/coderd.go b/enterprise/coderd/coderd.go index 5487cb76d93d5..c3cc5e0be5ccd 100644 --- a/enterprise/coderd/coderd.go +++ b/enterprise/coderd/coderd.go @@ -706,6 +706,10 @@ func derpMapper(logger slog.Logger, cfg *codersdk.DeploymentValues, proxyHealth // existing ID in the DERP map. regionID := int(startingRegionID) + int(status.Proxy.RegionID) regionCode := fmt.Sprintf("coder_%s", strings.ToLower(status.Proxy.Name)) + regionName := status.Proxy.DisplayName + if regionName == "" { + regionName = status.Proxy.Name + } for _, r := range derpMap.Regions { if r.RegionID == regionID || r.RegionCode == regionCode { // Log a warning if we haven't logged one in the last @@ -768,7 +772,7 @@ func derpMapper(logger slog.Logger, cfg *codersdk.DeploymentValues, proxyHealth EmbeddedRelay: false, RegionID: regionID, RegionCode: regionCode, - RegionName: status.Proxy.DisplayName, + RegionName: regionName, Nodes: nodes, } } From 96ad4d3315266eed1621e63e5a44298c2218bccc Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Wed, 2 Aug 2023 02:20:43 +0000 Subject: [PATCH 3/3] fixup! fix: avoid infinite loop in agent derp-map --- codersdk/agentsdk/agentsdk.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/codersdk/agentsdk/agentsdk.go b/codersdk/agentsdk/agentsdk.go index e8cde1a65b90e..7f66c01bc864b 100644 --- a/codersdk/agentsdk/agentsdk.go +++ b/codersdk/agentsdk/agentsdk.go @@ -212,15 +212,22 @@ func (c *Client) DERPMapUpdates(ctx context.Context) (<-chan DERPMapUpdate, io.C update.Err = err update.DERPMap = nil } - err = c.rewriteDerpMap(update.DERPMap) - if err != nil { - update.Err = err - update.DERPMap = nil + if update.DERPMap != nil { + err = c.rewriteDerpMap(update.DERPMap) + if err != nil { + update.Err = err + update.DERPMap = nil + } } select { case updates <- update: case <-ctx.Done(): + // Unblock the caller if they're waiting for an update. + select { + case updates <- DERPMapUpdate{Err: ctx.Err()}: + default: + } return } if update.Err != nil {