fix(utils): move ping logic after peer info lookup and deduplicate address retrieval logic

This commit is contained in:
nullcat
2026-05-29 14:56:17 +08:00
parent 4dde0942ce
commit c853084a7b
2 changed files with 20 additions and 20 deletions
+2 -10
View File
@@ -88,11 +88,7 @@ func runForwarder(ctx context.Context, srv *tsnet.Server, rule ForwardRule, tag
} }
func runTCPForwarder(ctx context.Context, srv *tsnet.Server, rule ForwardRule, logger *slog.Logger) { func runTCPForwarder(ctx context.Context, srv *tsnet.Server, rule ForwardRule, logger *slog.Logger) {
ip4, ip6 := srv.TailscaleIPs() ip := getSelfTsnetAddr(srv)
ip := ip4
if !ip.IsValid() {
ip = ip6
}
ln, err := srv.Listen("tcp", fmt.Sprintf("%s:%d", ip.String(), rule.TailscalePort)) ln, err := srv.Listen("tcp", fmt.Sprintf("%s:%d", ip.String(), rule.TailscalePort))
if err != nil { if err != nil {
logger.Error("failed to listen", "error", err) logger.Error("failed to listen", "error", err)
@@ -178,11 +174,7 @@ func getConnType(ctx context.Context, srv *tsnet.Server, remoteAddrStr string) s
} }
func runUDPForwarder(ctx context.Context, srv *tsnet.Server, rule ForwardRule, logger *slog.Logger) { func runUDPForwarder(ctx context.Context, srv *tsnet.Server, rule ForwardRule, logger *slog.Logger) {
ip4, ip6 := srv.TailscaleIPs() ip := getSelfTsnetAddr(srv)
ip := ip4
if !ip.IsValid() {
ip = ip6
}
ln, err := srv.Listen("udp", fmt.Sprintf("%s:%d", ip.String(), rule.TailscalePort)) ln, err := srv.Listen("udp", fmt.Sprintf("%s:%d", ip.String(), rule.TailscalePort))
if err != nil { if err != nil {
logger.Error("failed to listen", "error", err) logger.Error("failed to listen", "error", err)
+18 -10
View File
@@ -109,6 +109,14 @@ func getPeerFromRules(ctx context.Context, srv *tsnet.Server, rules map[string][
func peerConnectivityLogic(ctx context.Context, lc *local.Client, relativePeers []netip.Addr, logger *slog.Logger) { func peerConnectivityLogic(ctx context.Context, lc *local.Client, relativePeers []netip.Addr, logger *slog.Logger) {
for _, peer := range relativePeers { for _, peer := range relativePeers {
loLog := logger.With("peer", peer)
peerInfo, err := lc.WhoIs(ctx, peer.String())
if err != nil {
loLog.Warn("failed to get peer info", "err", err)
} else {
loLog = loLog.With("name", peerInfo.Node.ComputedName)
}
ping, err := func() (*ipnstate.PingResult, error) { ping, err := func() (*ipnstate.PingResult, error) {
cnclCtx, cancel := context.WithTimeout(ctx, 5*time.Second) cnclCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel() defer cancel()
@@ -117,22 +125,13 @@ func peerConnectivityLogic(ctx context.Context, lc *local.Client, relativePeers
return ping, err return ping, err
}() }()
loLog := logger.With("peer", peer)
peerInfo, err := lc.WhoIs(ctx, peer.String())
if err != nil {
loLog.Warn("failed to get peer info", "err", err)
continue
} else {
loLog = loLog.With("name", peerInfo.Node.ComputedName)
}
if err != nil { if err != nil {
if errors.Is(err, context.DeadlineExceeded) { if errors.Is(err, context.DeadlineExceeded) {
loLog.Warn("connectivity: peer ping timeout") loLog.Warn("connectivity: peer ping timeout")
} else { } else {
loLog.Warn("connectivity: failed to ping peer", "err", err) loLog.Warn("connectivity: failed to ping peer", "err", err)
} }
return continue
} }
var connect string var connect string
@@ -180,3 +179,12 @@ func StartPeerConnectivityDiagnostics(ctx context.Context, logger *slog.Logger,
} }
}() }()
} }
func getSelfTsnetAddr(srv *tsnet.Server) netip.Addr {
ip4, ip6 := srv.TailscaleIPs()
ip := ip4
if !ip.IsValid() {
ip = ip6
}
return ip
}