mirror of
https://github.com/coder/coder.git
synced 2025-07-09 11:45:56 +00:00
Only send tailnet nodes updates with preferred DERP (#7387)
Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@ -631,6 +631,14 @@ func (c *Conn) sendNode() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
node := c.selfNode()
|
node := c.selfNode()
|
||||||
|
// Conn.UpdateNodes will skip any nodes that don't have the PreferredDERP
|
||||||
|
// set to non-zero, since we cannot reach nodes without DERP for discovery.
|
||||||
|
// Therefore, there is no point in sending the node without this, and we can
|
||||||
|
// save ourselves from churn in the tailscale/wireguard layer.
|
||||||
|
if node.PreferredDERP == 0 {
|
||||||
|
c.logger.Debug(context.Background(), "skipped sending node; no PreferredDERP", slog.F("node", node))
|
||||||
|
return
|
||||||
|
}
|
||||||
nodeCallback := c.nodeCallback
|
nodeCallback := c.nodeCallback
|
||||||
if nodeCallback == nil {
|
if nodeCallback == nil {
|
||||||
return
|
return
|
||||||
|
@ -165,3 +165,33 @@ func TestTailnet(t *testing.T) {
|
|||||||
w2.Close()
|
w2.Close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestConn_PreferredDERP tests that we only trigger the NodeCallback when we have a preferred DERP server.
|
||||||
|
func TestConn_PreferredDERP(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||||
|
defer cancel()
|
||||||
|
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
|
||||||
|
derpMap := tailnettest.RunDERPAndSTUN(t)
|
||||||
|
conn, err := tailnet.NewConn(&tailnet.Options{
|
||||||
|
Addresses: []netip.Prefix{netip.PrefixFrom(tailnet.IP(), 128)},
|
||||||
|
Logger: logger.Named("w1"),
|
||||||
|
DERPMap: derpMap,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
defer func() {
|
||||||
|
err := conn.Close()
|
||||||
|
require.NoError(t, err)
|
||||||
|
}()
|
||||||
|
// buffer channel so callback doesn't block
|
||||||
|
nodes := make(chan *tailnet.Node, 50)
|
||||||
|
conn.SetNodeCallback(func(node *tailnet.Node) {
|
||||||
|
nodes <- node
|
||||||
|
})
|
||||||
|
select {
|
||||||
|
case node := <-nodes:
|
||||||
|
require.Equal(t, 1, node.PreferredDERP)
|
||||||
|
case <-ctx.Done():
|
||||||
|
t.Fatal("timed out waiting for node")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user