From 13d0b8e6a42bd14405ab5ade3cf7d23ac806c296 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 17 Jun 2022 10:09:23 -0700 Subject: [PATCH] control/controlclient, net/dnscache: use typed singleflight fork Change-Id: I12be4c5a91ae3a812fe88d9b2d15526fdbb5a921 Signed-off-by: Brad Fitzpatrick --- cmd/tailscale/depaware.txt | 4 ++-- cmd/tailscaled/depaware.txt | 4 ++-- control/controlclient/direct.go | 11 +++++------ net/dnscache/dnscache.go | 20 +++++++++++--------- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index 638a32120..142097480 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -90,6 +90,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep W tailscale.com/util/endian from tailscale.com/net/netns tailscale.com/util/groupmember from tailscale.com/cmd/tailscale/cli tailscale.com/util/lineread from tailscale.com/net/interfaces+ + tailscale.com/util/singleflight from tailscale.com/net/dnscache W 💣 tailscale.com/util/winutil from tailscale.com/hostinfo+ tailscale.com/version from tailscale.com/cmd/tailscale/cli+ tailscale.com/version/distro from tailscale.com/cmd/tailscale/cli+ @@ -114,7 +115,6 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep golang.org/x/net/proxy from tailscale.com/net/netns D golang.org/x/net/route from net+ golang.org/x/sync/errgroup from tailscale.com/derp+ - golang.org/x/sync/singleflight from tailscale.com/net/dnscache golang.org/x/sys/cpu from golang.org/x/crypto/blake2b+ LD golang.org/x/sys/unix from tailscale.com/net/netns+ W golang.org/x/sys/windows from golang.org/x/sys/windows/registry+ @@ -201,7 +201,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep reflect from crypto/x509+ regexp from github.com/tailscale/goupnp/httpu+ regexp/syntax from regexp - runtime/debug from golang.org/x/sync/singleflight+ + runtime/debug from tailscale.com/util/singleflight+ sort from compress/flate+ strconv from compress/flate+ strings from bufio+ diff --git a/cmd/tailscaled/depaware.txt b/cmd/tailscaled/depaware.txt index 5901580cc..0833478f2 100644 --- a/cmd/tailscaled/depaware.txt +++ b/cmd/tailscaled/depaware.txt @@ -271,6 +271,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de tailscale.com/util/osshare from tailscale.com/ipn/ipnlocal+ tailscale.com/util/pidowner from tailscale.com/ipn/ipnserver tailscale.com/util/racebuild from tailscale.com/logpolicy + tailscale.com/util/singleflight from tailscale.com/control/controlclient+ tailscale.com/util/systemd from tailscale.com/control/controlclient+ tailscale.com/util/uniq from tailscale.com/wgengine/magicsock 💣 tailscale.com/util/winutil from tailscale.com/cmd/tailscaled+ @@ -316,7 +317,6 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de golang.org/x/net/proxy from tailscale.com/net/netns D golang.org/x/net/route from net+ golang.org/x/sync/errgroup from github.com/mdlayher/socket+ - golang.org/x/sync/singleflight from tailscale.com/control/controlclient+ golang.org/x/sys/cpu from golang.org/x/crypto/blake2b+ LD golang.org/x/sys/unix from github.com/insomniacslk/dhcp/interfaces+ W golang.org/x/sys/windows from github.com/go-ole/go-ole+ @@ -405,7 +405,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de reflect from crypto/x509+ regexp from github.com/coreos/go-iptables/iptables+ regexp/syntax from regexp - runtime/debug from golang.org/x/sync/singleflight+ + runtime/debug from github.com/klauspost/compress/zstd+ runtime/pprof from tailscale.com/log/logheap+ runtime/trace from net/http/pprof sort from compress/flate+ diff --git a/control/controlclient/direct.go b/control/controlclient/direct.go index bff285865..9c4e664fc 100644 --- a/control/controlclient/direct.go +++ b/control/controlclient/direct.go @@ -26,7 +26,6 @@ import ( "time" "go4.org/mem" - "golang.org/x/sync/singleflight" "inet.af/netaddr" "tailscale.com/control/controlknobs" "tailscale.com/envknob" @@ -50,6 +49,7 @@ import ( "tailscale.com/types/persist" "tailscale.com/util/clientmetric" "tailscale.com/util/multierr" + "tailscale.com/util/singleflight" "tailscale.com/util/systemd" "tailscale.com/wgengine/monitor" ) @@ -77,7 +77,7 @@ type Direct struct { serverKey key.MachinePublic // original ("legacy") nacl crypto_box-based public key serverNoiseKey key.MachinePublic - sfGroup singleflight.Group // protects noiseClient creation. + sfGroup singleflight.Group[struct{}, *noiseClient] // protects noiseClient creation. noiseClient *noiseClient persist persist.Persist @@ -1280,13 +1280,12 @@ func (c *Direct) getNoiseClient() (*noiseClient, error) { if nc != nil { return nc, nil } - np, err, _ := c.sfGroup.Do("noise", func() (any, error) { + nc, err, _ := c.sfGroup.Do(struct{}{}, func() (*noiseClient, error) { k, err := c.getMachinePrivKey() if err != nil { return nil, err } - - nc, err = newNoiseClient(k, serverNoiseKey, c.serverURL, c.dialer) + nc, err := newNoiseClient(k, serverNoiseKey, c.serverURL, c.dialer) if err != nil { return nil, err } @@ -1298,7 +1297,7 @@ func (c *Direct) getNoiseClient() (*noiseClient, error) { if err != nil { return nil, err } - return np.(*noiseClient), nil + return nc, nil } // setDNSNoise sends the SetDNSRequest request to the control plane server over Noise, diff --git a/net/dnscache/dnscache.go b/net/dnscache/dnscache.go index 830b894b3..b8c748d3b 100644 --- a/net/dnscache/dnscache.go +++ b/net/dnscache/dnscache.go @@ -19,9 +19,9 @@ import ( "sync" "time" - "golang.org/x/sync/singleflight" "inet.af/netaddr" "tailscale.com/envknob" + "tailscale.com/util/singleflight" ) var single = &Resolver{ @@ -81,12 +81,18 @@ type Resolver struct { // It is required when SingleHostStaticResult is present. SingleHost string - sf singleflight.Group + sf singleflight.Group[string, ipRes] mu sync.Mutex ipCache map[string]ipCacheEntry } +// ipRes is the type used by the Resolver.sf singleflight group. +type ipRes struct { + ip, ip6 net.IP + allIPs []net.IPAddr +} + type ipCacheEntry struct { ip net.IP // either v4 or v6 ip6 net.IP // nil if no v4 or no v6 @@ -150,14 +156,10 @@ func (r *Resolver) LookupIP(ctx context.Context, host string) (ip, v6 net.IP, al return ip, ip6, allIPs, nil } - type ipRes struct { - ip, ip6 net.IP - allIPs []net.IPAddr - } - ch := r.sf.DoChan(host, func() (any, error) { + ch := r.sf.DoChan(host, func() (ret ipRes, _ error) { ip, ip6, allIPs, err := r.lookupIP(host) if err != nil { - return nil, err + return ret, err } return ipRes{ip, ip6, allIPs}, nil }) @@ -177,7 +179,7 @@ func (r *Resolver) LookupIP(ctx context.Context, host string) (ip, v6 net.IP, al } return nil, nil, nil, res.Err } - r := res.Val.(ipRes) + r := res.Val return r.ip, r.ip6, r.allIPs, nil case <-ctx.Done(): if debug {