From d12ad615cf27240be008fd5f5ffafac4adf595be Mon Sep 17 00:00:00 2001 From: nullcat Date: Sun, 24 May 2026 23:37:31 +0800 Subject: [PATCH] feat(utils): add timeout on ping request --- core/utils.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/utils.go b/core/utils.go index 7841e5a..f3add4f 100644 --- a/core/utils.go +++ b/core/utils.go @@ -11,6 +11,7 @@ import ( "time" "tailscale.com/client/local" + "tailscale.com/ipn/ipnstate" "tailscale.com/tailcfg" "tailscale.com/tsnet" ) @@ -109,11 +110,23 @@ 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) { for _, peer := range relativePeers { - ping, err := lc.Ping(ctx, peer, tailcfg.PingDisco) + ping, err := func() (*ipnstate.PingResult, error) { + cnclCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + + ping, err := lc.Ping(cnclCtx, peer, tailcfg.PingDisco) + return ping, err + }() + if err != nil { - logger.Debug("connectivity: failed to ping peer", "peer", peer, "err", err) + if errors.Is(err, context.DeadlineExceeded) { + logger.Warn("connectivity: peer ping timeout", "peer", peer) + } else { + logger.Warn("connectivity: failed to ping peer", "peer", peer, "err", err) + } return } + var connect string if ping.DERPRegionCode == "" { connect = "direct"