control/controlclient, net/dnscache: use typed singleflight fork

Change-Id: I12be4c5a91ae3a812fe88d9b2d15526fdbb5a921
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/4877/head
Brad Fitzpatrick 2 years ago committed by Brad Fitzpatrick
parent 59ed846277
commit 13d0b8e6a4

@ -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 W tailscale.com/util/endian from tailscale.com/net/netns
tailscale.com/util/groupmember from tailscale.com/cmd/tailscale/cli tailscale.com/util/groupmember from tailscale.com/cmd/tailscale/cli
tailscale.com/util/lineread from tailscale.com/net/interfaces+ 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+ W 💣 tailscale.com/util/winutil from tailscale.com/hostinfo+
tailscale.com/version from tailscale.com/cmd/tailscale/cli+ tailscale.com/version from tailscale.com/cmd/tailscale/cli+
tailscale.com/version/distro 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 golang.org/x/net/proxy from tailscale.com/net/netns
D golang.org/x/net/route from net+ D golang.org/x/net/route from net+
golang.org/x/sync/errgroup from tailscale.com/derp+ 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+ golang.org/x/sys/cpu from golang.org/x/crypto/blake2b+
LD golang.org/x/sys/unix from tailscale.com/net/netns+ LD golang.org/x/sys/unix from tailscale.com/net/netns+
W golang.org/x/sys/windows from golang.org/x/sys/windows/registry+ 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+ reflect from crypto/x509+
regexp from github.com/tailscale/goupnp/httpu+ regexp from github.com/tailscale/goupnp/httpu+
regexp/syntax from regexp regexp/syntax from regexp
runtime/debug from golang.org/x/sync/singleflight+ runtime/debug from tailscale.com/util/singleflight+
sort from compress/flate+ sort from compress/flate+
strconv from compress/flate+ strconv from compress/flate+
strings from bufio+ strings from bufio+

@ -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/osshare from tailscale.com/ipn/ipnlocal+
tailscale.com/util/pidowner from tailscale.com/ipn/ipnserver tailscale.com/util/pidowner from tailscale.com/ipn/ipnserver
tailscale.com/util/racebuild from tailscale.com/logpolicy 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/systemd from tailscale.com/control/controlclient+
tailscale.com/util/uniq from tailscale.com/wgengine/magicsock tailscale.com/util/uniq from tailscale.com/wgengine/magicsock
💣 tailscale.com/util/winutil from tailscale.com/cmd/tailscaled+ 💣 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 golang.org/x/net/proxy from tailscale.com/net/netns
D golang.org/x/net/route from net+ D golang.org/x/net/route from net+
golang.org/x/sync/errgroup from github.com/mdlayher/socket+ 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+ golang.org/x/sys/cpu from golang.org/x/crypto/blake2b+
LD golang.org/x/sys/unix from github.com/insomniacslk/dhcp/interfaces+ 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+ 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+ reflect from crypto/x509+
regexp from github.com/coreos/go-iptables/iptables+ regexp from github.com/coreos/go-iptables/iptables+
regexp/syntax from regexp 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/pprof from tailscale.com/log/logheap+
runtime/trace from net/http/pprof runtime/trace from net/http/pprof
sort from compress/flate+ sort from compress/flate+

@ -26,7 +26,6 @@ import (
"time" "time"
"go4.org/mem" "go4.org/mem"
"golang.org/x/sync/singleflight"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/control/controlknobs" "tailscale.com/control/controlknobs"
"tailscale.com/envknob" "tailscale.com/envknob"
@ -50,6 +49,7 @@ import (
"tailscale.com/types/persist" "tailscale.com/types/persist"
"tailscale.com/util/clientmetric" "tailscale.com/util/clientmetric"
"tailscale.com/util/multierr" "tailscale.com/util/multierr"
"tailscale.com/util/singleflight"
"tailscale.com/util/systemd" "tailscale.com/util/systemd"
"tailscale.com/wgengine/monitor" "tailscale.com/wgengine/monitor"
) )
@ -77,7 +77,7 @@ type Direct struct {
serverKey key.MachinePublic // original ("legacy") nacl crypto_box-based public key serverKey key.MachinePublic // original ("legacy") nacl crypto_box-based public key
serverNoiseKey key.MachinePublic serverNoiseKey key.MachinePublic
sfGroup singleflight.Group // protects noiseClient creation. sfGroup singleflight.Group[struct{}, *noiseClient] // protects noiseClient creation.
noiseClient *noiseClient noiseClient *noiseClient
persist persist.Persist persist persist.Persist
@ -1280,13 +1280,12 @@ func (c *Direct) getNoiseClient() (*noiseClient, error) {
if nc != nil { if nc != nil {
return 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() k, err := c.getMachinePrivKey()
if err != nil { if err != nil {
return nil, err return nil, err
} }
nc, err := newNoiseClient(k, serverNoiseKey, c.serverURL, c.dialer)
nc, err = newNoiseClient(k, serverNoiseKey, c.serverURL, c.dialer)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1298,7 +1297,7 @@ func (c *Direct) getNoiseClient() (*noiseClient, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return np.(*noiseClient), nil return nc, nil
} }
// setDNSNoise sends the SetDNSRequest request to the control plane server over Noise, // setDNSNoise sends the SetDNSRequest request to the control plane server over Noise,

@ -19,9 +19,9 @@ import (
"sync" "sync"
"time" "time"
"golang.org/x/sync/singleflight"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/envknob" "tailscale.com/envknob"
"tailscale.com/util/singleflight"
) )
var single = &Resolver{ var single = &Resolver{
@ -81,12 +81,18 @@ type Resolver struct {
// It is required when SingleHostStaticResult is present. // It is required when SingleHostStaticResult is present.
SingleHost string SingleHost string
sf singleflight.Group sf singleflight.Group[string, ipRes]
mu sync.Mutex mu sync.Mutex
ipCache map[string]ipCacheEntry 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 { type ipCacheEntry struct {
ip net.IP // either v4 or v6 ip net.IP // either v4 or v6
ip6 net.IP // nil if no v4 or no 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 return ip, ip6, allIPs, nil
} }
type ipRes struct { ch := r.sf.DoChan(host, func() (ret ipRes, _ error) {
ip, ip6 net.IP
allIPs []net.IPAddr
}
ch := r.sf.DoChan(host, func() (any, error) {
ip, ip6, allIPs, err := r.lookupIP(host) ip, ip6, allIPs, err := r.lookupIP(host)
if err != nil { if err != nil {
return nil, err return ret, err
} }
return ipRes{ip, ip6, allIPs}, nil 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 return nil, nil, nil, res.Err
} }
r := res.Val.(ipRes) r := res.Val
return r.ip, r.ip6, r.allIPs, nil return r.ip, r.ip6, r.allIPs, nil
case <-ctx.Done(): case <-ctx.Done():
if debug { if debug {

Loading…
Cancel
Save