fix: avoid infinite loop in agent derp-map (#8848)

This commit is contained in:
Dean Sheather
2023-08-01 20:18:46 -07:00
committed by GitHub
parent 805eaca4b7
commit 6b69970d7c
2 changed files with 20 additions and 8 deletions

View File

@ -211,18 +211,26 @@ func (c *Client) DERPMapUpdates(ctx context.Context) (<-chan DERPMapUpdate, io.C
if err != nil {
update.Err = err
update.DERPMap = nil
return
}
if update.DERPMap != nil {
err = c.rewriteDerpMap(update.DERPMap)
if err != nil {
update.Err = err
update.DERPMap = nil
return
}
}
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 {
return
}
}
@ -231,8 +239,8 @@ func (c *Client) DERPMapUpdates(ctx context.Context) (<-chan DERPMapUpdate, io.C
return updates, &closer{
closeFunc: func() error {
cancelFunc()
_ = wsNetConn.Close()
<-pingClosed
_ = conn.Close(websocket.StatusGoingAway, "Listen closed")
<-updatesClosed
return nil
},

View File

@ -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.Name,
RegionName: regionName,
Nodes: nodes,
}
}