diff options
| author | Mihai Parparita <mihai@tailscale.com> | 2023-04-17 16:01:41 -0700 |
|---|---|---|
| committer | Mihai Parparita <mihai.parparita@gmail.com> | 2023-04-20 15:46:01 -0700 |
| commit | 7330aa593e3701cb193ceff0bc26eda3bc62df83 (patch) | |
| tree | d76ab14868a92aa799dbb2119502b7ee267f06dd /cmd | |
| parent | 7f17e04a5a7952f9c1ed0e23b799a21a124a5a51 (diff) | |
| download | tailscale-7330aa593e3701cb193ceff0bc26eda3bc62df83.tar.xz tailscale-7330aa593e3701cb193ceff0bc26eda3bc62df83.zip | |
all: avoid repeated default interface lookups
On some platforms (notably macOS and iOS) we look up the default
interface to bind outgoing connections to. This is both duplicated
work and results in logspam when the default interface is not available
(i.e. when a phone has no connectivity, we log an error and thus cause
more things that we will try to upload and fail).
Fixed by passing around a netmon.Monitor to more places, so that we can
use its cached interface state.
Fixes #7850
Updates #7621
Signed-off-by: Mihai Parparita <mihai@tailscale.com>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/derper/depaware.txt | 2 | ||||
| -rw-r--r-- | cmd/tailscale/cli/netcheck.go | 8 | ||||
| -rw-r--r-- | cmd/tailscale/depaware.txt | 2 | ||||
| -rw-r--r-- | cmd/tailscaled/debug.go | 4 | ||||
| -rw-r--r-- | cmd/tailscaled/tailscaled.go | 25 | ||||
| -rw-r--r-- | cmd/tailscaled/tailscaled_windows.go | 8 | ||||
| -rw-r--r-- | cmd/tsconnect/wasm/wasm_js.go | 2 |
7 files changed, 33 insertions, 18 deletions
diff --git a/cmd/derper/depaware.txt b/cmd/derper/depaware.txt index 7e82305d1..b40ca360a 100644 --- a/cmd/derper/depaware.txt +++ b/cmd/derper/depaware.txt @@ -86,7 +86,7 @@ tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depawa 💣 tailscale.com/net/interfaces from tailscale.com/net/netns+ tailscale.com/net/netaddr from tailscale.com/ipn+ tailscale.com/net/netknob from tailscale.com/net/netns - tailscale.com/net/netmon from tailscale.com/net/sockstats + tailscale.com/net/netmon from tailscale.com/net/sockstats+ tailscale.com/net/netns from tailscale.com/derp/derphttp tailscale.com/net/netutil from tailscale.com/client/tailscale tailscale.com/net/packet from tailscale.com/wgengine/filter diff --git a/cmd/tailscale/cli/netcheck.go b/cmd/tailscale/cli/netcheck.go index 0c2f7acd1..bac5a0a48 100644 --- a/cmd/tailscale/cli/netcheck.go +++ b/cmd/tailscale/cli/netcheck.go @@ -19,6 +19,7 @@ import ( "tailscale.com/envknob" "tailscale.com/ipn" "tailscale.com/net/netcheck" + "tailscale.com/net/netmon" "tailscale.com/net/portmapper" "tailscale.com/tailcfg" "tailscale.com/types/logger" @@ -45,9 +46,14 @@ var netcheckArgs struct { } func runNetcheck(ctx context.Context, args []string) error { + logf := logger.WithPrefix(log.Printf, "portmap: ") + netMon, err := netmon.New(logf) + if err != nil { + return err + } c := &netcheck.Client{ UDPBindAddr: envknob.String("TS_DEBUG_NETCHECK_UDP_BIND"), - PortMapper: portmapper.NewClient(logger.WithPrefix(log.Printf, "portmap: "), nil, nil), + PortMapper: portmapper.NewClient(logf, netMon, nil, nil), UseDNSCache: false, // always resolve, don't cache } if netcheckArgs.verbose { diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index b146ec567..5b644992e 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -74,7 +74,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep tailscale.com/net/netcheck from tailscale.com/cmd/tailscale/cli tailscale.com/net/neterror from tailscale.com/net/netcheck+ tailscale.com/net/netknob from tailscale.com/net/netns - tailscale.com/net/netmon from tailscale.com/net/sockstats + tailscale.com/net/netmon from tailscale.com/net/sockstats+ tailscale.com/net/netns from tailscale.com/derp/derphttp+ tailscale.com/net/netutil from tailscale.com/client/tailscale+ tailscale.com/net/packet from tailscale.com/wgengine/filter+ diff --git a/cmd/tailscaled/debug.go b/cmd/tailscaled/debug.go index 8c1ad88b1..b6a95ba49 100644 --- a/cmd/tailscaled/debug.go +++ b/cmd/tailscaled/debug.go @@ -193,8 +193,8 @@ func checkDerp(ctx context.Context, derpRegion string) (err error) { priv1 := key.NewNode() priv2 := key.NewNode() - c1 := derphttp.NewRegionClient(priv1, log.Printf, getRegion) - c2 := derphttp.NewRegionClient(priv2, log.Printf, getRegion) + c1 := derphttp.NewRegionClient(priv1, log.Printf, nil, getRegion) + c2 := derphttp.NewRegionClient(priv2, log.Printf, nil, getRegion) defer func() { if err != nil { c1.Close() diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 3bae560a2..d2c28de99 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -329,7 +329,15 @@ var logPol *logpolicy.Policy var debugMux *http.ServeMux func run() error { - pol := logpolicy.New(logtail.CollectionNode) + var logf logger.Logf = log.Printf + netMon, err := netmon.New(func(format string, args ...any) { + logf(format, args...) + }) + if err != nil { + return fmt.Errorf("netmon.New: %w", err) + } + + pol := logpolicy.New(logtail.CollectionNode, netMon) pol.SetVerbosityLevel(args.verbose) logPol = pol defer func() { @@ -353,7 +361,6 @@ func run() error { return nil } - var logf logger.Logf = log.Printf if envknob.Bool("TS_DEBUG_MEMORY") { logf = logger.RusagePrefixLog(logf) } @@ -379,10 +386,10 @@ func run() error { debugMux = newDebugMux() } - return startIPNServer(context.Background(), logf, pol.PublicID) + return startIPNServer(context.Background(), logf, pol.PublicID, netMon) } -func startIPNServer(ctx context.Context, logf logger.Logf, logID logid.PublicID) error { +func startIPNServer(ctx context.Context, logf logger.Logf, logID logid.PublicID, netMon *netmon.Monitor) error { ln, err := safesocket.Listen(args.socketpath) if err != nil { return fmt.Errorf("safesocket.Listen: %v", err) @@ -408,7 +415,7 @@ func startIPNServer(ctx context.Context, logf logger.Logf, logID logid.PublicID) } }() - srv := ipnserver.New(logf, logID) + srv := ipnserver.New(logf, logID, netMon) if debugMux != nil { debugMux.HandleFunc("/debug/ipn", srv.ServeHTMLStatus) } @@ -426,7 +433,7 @@ func startIPNServer(ctx context.Context, logf logger.Logf, logID logid.PublicID) return } } - lb, err := getLocalBackend(ctx, logf, logID) + lb, err := getLocalBackend(ctx, logf, logID, netMon) if err == nil { logf("got LocalBackend in %v", time.Since(t0).Round(time.Millisecond)) srv.SetLocalBackend(lb) @@ -450,11 +457,7 @@ func startIPNServer(ctx context.Context, logf logger.Logf, logID logid.PublicID) return nil } -func getLocalBackend(ctx context.Context, logf logger.Logf, logID logid.PublicID) (_ *ipnlocal.LocalBackend, retErr error) { - netMon, err := netmon.New(logf) - if err != nil { - return nil, fmt.Errorf("netmon.New: %w", err) - } +func getLocalBackend(ctx context.Context, logf logger.Logf, logID logid.PublicID, netMon *netmon.Monitor) (_ *ipnlocal.LocalBackend, retErr error) { if logPol != nil { logPol.Logtail.SetNetMon(netMon) } diff --git a/cmd/tailscaled/tailscaled_windows.go b/cmd/tailscaled/tailscaled_windows.go index a654dadf4..077d3f99f 100644 --- a/cmd/tailscaled/tailscaled_windows.go +++ b/cmd/tailscaled/tailscaled_windows.go @@ -45,6 +45,7 @@ import ( "tailscale.com/logpolicy" "tailscale.com/logtail/backoff" "tailscale.com/net/dns" + "tailscale.com/net/netmon" "tailscale.com/net/tstun" "tailscale.com/types/logger" "tailscale.com/types/logid" @@ -291,8 +292,13 @@ func beWindowsSubprocess() bool { } }() + netMon, err := netmon.New(log.Printf) + if err != nil { + log.Printf("Could not create netMon: %v", err) + netMon = nil + } publicLogID, _ := logid.ParsePublicID(logID) - err := startIPNServer(ctx, log.Printf, publicLogID) + err = startIPNServer(ctx, log.Printf, publicLogID, netMon) if err != nil { log.Fatalf("ipnserver: %v", err) } diff --git a/cmd/tsconnect/wasm/wasm_js.go b/cmd/tsconnect/wasm/wasm_js.go index f94b850a2..a1b0fd95e 100644 --- a/cmd/tsconnect/wasm/wasm_js.go +++ b/cmd/tsconnect/wasm/wasm_js.go @@ -123,7 +123,7 @@ func newIPN(jsConfig js.Value) map[string]any { } logid := lpc.PublicID - srv := ipnserver.New(logf, logid) + srv := ipnserver.New(logf, logid, nil /* no netMon */) lb, err := ipnlocal.NewLocalBackend(logf, logid, store, dialer, eng, controlclient.LoginEphemeral) if err != nil { log.Fatalf("ipnlocal.NewLocalBackend: %v", err) |
