Skip to content

Commit 443068e

Browse files
committed
[tunnel] cache endpoint selection to avoid re-probing on every reconcile
The latency-based endpoint selector was doing a full QUIC handshake + 3 ping requests to every edge endpoint on every TunnelNode status update (credentials, agent status, address changes). This added 3s+ of blocking delay to each reconcile cycle. Cache the selected endpoint and sorted address list, and only re-probe when the address list actually changes.
1 parent 5b524ad commit 443068e

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

pkg/cmd/tunnel/run.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"log/slog"
88
"math/rand"
9+
"slices"
910
"net/http"
1011
"net/netip"
1112
"os"
@@ -112,6 +113,10 @@ type tunnelNodeReconciler struct {
112113
// Endpoint selector for choosing tunnel server addresses.
113114
endpointSelector endpointselect.Selector
114115

116+
// Cached endpoint selection — only re-probe when addresses change.
117+
lastAddresses []string
118+
lastSelected string
119+
115120
// Dial parameters protected by dialMu
116121
dialMu sync.RWMutex
117122
tunnelUID uuid.UUID
@@ -439,14 +444,25 @@ func (t *tunnelNodeReconciler) reconcile(ctx context.Context, req ctrl.Request)
439444
} else if len(tunnelNode.Status.Addresses) == 1 {
440445
srvAddr = tunnelNode.Status.Addresses[0]
441446
} else {
442-
// Use endpoint selector to choose the best endpoint.
443-
selected, err := t.endpointSelector.Select(ctx, tunnelNode.Status.Addresses)
444-
if err != nil {
445-
log.Warn("Endpoint selection failed, using random",
446-
slog.Any("error", err))
447-
srvAddr = tunnelNode.Status.Addresses[rand.Intn(len(tunnelNode.Status.Addresses))]
447+
// Re-probe only when the address list changes.
448+
addrs := tunnelNode.Status.Addresses
449+
sorted := make([]string, len(addrs))
450+
copy(sorted, addrs)
451+
slices.Sort(sorted)
452+
453+
if t.lastSelected != "" && slices.Equal(sorted, t.lastAddresses) {
454+
srvAddr = t.lastSelected
448455
} else {
449-
srvAddr = selected
456+
selected, err := t.endpointSelector.Select(ctx, addrs)
457+
if err != nil {
458+
log.Warn("Endpoint selection failed, using random",
459+
slog.Any("error", err))
460+
srvAddr = addrs[rand.Intn(len(addrs))]
461+
} else {
462+
srvAddr = selected
463+
}
464+
t.lastAddresses = sorted
465+
t.lastSelected = srvAddr
450466
}
451467
}
452468
} else {

0 commit comments

Comments
 (0)