Skip to content

Commit b3689c8

Browse files
authored
Only send tailnet nodes updates with preferred DERP (#7387)
Signed-off-by: Spike Curtis <spike@coder.com>
1 parent 4e52112 commit b3689c8

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

tailnet/conn.go

+8
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,14 @@ func (c *Conn) sendNode() {
631631
return
632632
}
633633
node := c.selfNode()
634+
// Conn.UpdateNodes will skip any nodes that don't have the PreferredDERP
635+
// set to non-zero, since we cannot reach nodes without DERP for discovery.
636+
// Therefore, there is no point in sending the node without this, and we can
637+
// save ourselves from churn in the tailscale/wireguard layer.
638+
if node.PreferredDERP == 0 {
639+
c.logger.Debug(context.Background(), "skipped sending node; no PreferredDERP", slog.F("node", node))
640+
return
641+
}
634642
nodeCallback := c.nodeCallback
635643
if nodeCallback == nil {
636644
return

tailnet/conn_test.go

+30
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,33 @@ func TestTailnet(t *testing.T) {
165165
w2.Close()
166166
})
167167
}
168+
169+
// TestConn_PreferredDERP tests that we only trigger the NodeCallback when we have a preferred DERP server.
170+
func TestConn_PreferredDERP(t *testing.T) {
171+
t.Parallel()
172+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
173+
defer cancel()
174+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
175+
derpMap := tailnettest.RunDERPAndSTUN(t)
176+
conn, err := tailnet.NewConn(&tailnet.Options{
177+
Addresses: []netip.Prefix{netip.PrefixFrom(tailnet.IP(), 128)},
178+
Logger: logger.Named("w1"),
179+
DERPMap: derpMap,
180+
})
181+
require.NoError(t, err)
182+
defer func() {
183+
err := conn.Close()
184+
require.NoError(t, err)
185+
}()
186+
// buffer channel so callback doesn't block
187+
nodes := make(chan *tailnet.Node, 50)
188+
conn.SetNodeCallback(func(node *tailnet.Node) {
189+
nodes <- node
190+
})
191+
select {
192+
case node := <-nodes:
193+
require.Equal(t, 1, node.PreferredDERP)
194+
case <-ctx.Done():
195+
t.Fatal("timed out waiting for node")
196+
}
197+
}

0 commit comments

Comments
 (0)