mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-22 12:58:37 +00:00
util/slicesx: add MapKeys and MapValues from golang.org/x/exp/maps
Importing the ~deprecated golang.org/x/exp/maps as "xmaps" to not shadow the std "maps" was getting ugly. And using slices.Collect on an iterator is verbose & allocates more. So copy (x)maps.Keys+Values into our slicesx package instead. Updates #cleanup Updates #12912 Updates #14514 (pulled out of that change) Change-Id: I5e68d12729934de93cf4a9cd87c367645f86123a Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
17b881538a
commit
1e2e319e7d
@ -18,7 +18,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"golang.org/x/net/dns/dnsmessage"
|
"golang.org/x/net/dns/dnsmessage"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
"tailscale.com/types/views"
|
"tailscale.com/types/views"
|
||||||
@ -291,11 +290,11 @@ func (e *AppConnector) updateDomains(domains []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil {
|
if err := e.routeAdvertiser.UnadvertiseRoute(toRemove...); err != nil {
|
||||||
e.logf("failed to unadvertise routes on domain removal: %v: %v: %v", xmaps.Keys(oldDomains), toRemove, err)
|
e.logf("failed to unadvertise routes on domain removal: %v: %v: %v", slicesx.MapKeys(oldDomains), toRemove, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e.logf("handling domains: %v and wildcards: %v", xmaps.Keys(e.domains), e.wildcards)
|
e.logf("handling domains: %v and wildcards: %v", slicesx.MapKeys(e.domains), e.wildcards)
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateRoutes merges the supplied routes into the currently configured routes. The routes supplied
|
// updateRoutes merges the supplied routes into the currently configured routes. The routes supplied
|
||||||
@ -354,7 +353,7 @@ func (e *AppConnector) Domains() views.Slice[string] {
|
|||||||
e.mu.Lock()
|
e.mu.Lock()
|
||||||
defer e.mu.Unlock()
|
defer e.mu.Unlock()
|
||||||
|
|
||||||
return views.SliceOf(xmaps.Keys(e.domains))
|
return views.SliceOf(slicesx.MapKeys(e.domains))
|
||||||
}
|
}
|
||||||
|
|
||||||
// DomainRoutes returns a map of domains to resolved IP
|
// DomainRoutes returns a map of domains to resolved IP
|
||||||
|
@ -11,13 +11,13 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"golang.org/x/net/dns/dnsmessage"
|
"golang.org/x/net/dns/dnsmessage"
|
||||||
"tailscale.com/appc/appctest"
|
"tailscale.com/appc/appctest"
|
||||||
"tailscale.com/tstest"
|
"tailscale.com/tstest"
|
||||||
"tailscale.com/util/clientmetric"
|
"tailscale.com/util/clientmetric"
|
||||||
"tailscale.com/util/mak"
|
"tailscale.com/util/mak"
|
||||||
"tailscale.com/util/must"
|
"tailscale.com/util/must"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
func fakeStoreRoutes(*RouteInfo) error { return nil }
|
func fakeStoreRoutes(*RouteInfo) error { return nil }
|
||||||
@ -50,7 +50,7 @@ func TestUpdateDomains(t *testing.T) {
|
|||||||
// domains are explicitly downcased on set.
|
// domains are explicitly downcased on set.
|
||||||
a.UpdateDomains([]string{"UP.EXAMPLE.COM"})
|
a.UpdateDomains([]string{"UP.EXAMPLE.COM"})
|
||||||
a.Wait(ctx)
|
a.Wait(ctx)
|
||||||
if got, want := xmaps.Keys(a.domains), []string{"up.example.com"}; !slices.Equal(got, want) {
|
if got, want := slicesx.MapKeys(a.domains), []string{"up.example.com"}; !slices.Equal(got, want) {
|
||||||
t.Errorf("got %v; want %v", got, want)
|
t.Errorf("got %v; want %v", got, want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"maps"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@ -31,6 +30,7 @@ import (
|
|||||||
"tailscale.com/ipn"
|
"tailscale.com/ipn"
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/util/stringsx"
|
"tailscale.com/util/stringsx"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -616,7 +616,7 @@ type mullvadPeers struct {
|
|||||||
|
|
||||||
// sortedCountries returns countries containing mullvad nodes, sorted by name.
|
// sortedCountries returns countries containing mullvad nodes, sorted by name.
|
||||||
func (mp mullvadPeers) sortedCountries() []*mvCountry {
|
func (mp mullvadPeers) sortedCountries() []*mvCountry {
|
||||||
countries := slices.Collect(maps.Values(mp.countries))
|
countries := slicesx.MapValues(mp.countries)
|
||||||
slices.SortFunc(countries, func(a, b *mvCountry) int {
|
slices.SortFunc(countries, func(a, b *mvCountry) int {
|
||||||
return stringsx.CompareFold(a.name, b.name)
|
return stringsx.CompareFold(a.name, b.name)
|
||||||
})
|
})
|
||||||
@ -632,7 +632,7 @@ type mvCountry struct {
|
|||||||
|
|
||||||
// sortedCities returns cities containing mullvad nodes, sorted by name.
|
// sortedCities returns cities containing mullvad nodes, sorted by name.
|
||||||
func (mc *mvCountry) sortedCities() []*mvCity {
|
func (mc *mvCountry) sortedCities() []*mvCity {
|
||||||
cities := slices.Collect(maps.Values(mc.cities))
|
cities := slicesx.MapValues(mc.cities)
|
||||||
slices.SortFunc(cities, func(a, b *mvCity) int {
|
slices.SortFunc(cities, func(a, b *mvCity) int {
|
||||||
return stringsx.CompareFold(a.name, b.name)
|
return stringsx.CompareFold(a.name, b.name)
|
||||||
})
|
})
|
||||||
|
@ -15,10 +15,10 @@ import (
|
|||||||
|
|
||||||
"github.com/kballard/go-shellquote"
|
"github.com/kballard/go-shellquote"
|
||||||
"github.com/peterbourgon/ff/v3/ffcli"
|
"github.com/peterbourgon/ff/v3/ffcli"
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"tailscale.com/envknob"
|
"tailscale.com/envknob"
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
func exitNodeCmd() *ffcli.Command {
|
func exitNodeCmd() *ffcli.Command {
|
||||||
@ -255,7 +255,7 @@ func filterFormatAndSortExitNodes(peers []*ipnstate.PeerStatus, filterBy string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
filteredExitNodes := filteredExitNodes{
|
filteredExitNodes := filteredExitNodes{
|
||||||
Countries: xmaps.Values(countries),
|
Countries: slicesx.MapValues(countries),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, country := range filteredExitNodes.Countries {
|
for _, country := range filteredExitNodes.Countries {
|
||||||
|
@ -27,6 +27,7 @@ import (
|
|||||||
"tailscale.com/ipn"
|
"tailscale.com/ipn"
|
||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -707,10 +708,7 @@ func (e *serveEnv) printWebStatusTree(sc *ipn.ServeConfig, hp ipn.HostPort) erro
|
|||||||
return "", ""
|
return "", ""
|
||||||
}
|
}
|
||||||
|
|
||||||
var mounts []string
|
mounts := slicesx.MapKeys(sc.Web[hp].Handlers)
|
||||||
for k := range sc.Web[hp].Handlers {
|
|
||||||
mounts = append(mounts, k)
|
|
||||||
}
|
|
||||||
sort.Slice(mounts, func(i, j int) bool {
|
sort.Slice(mounts, func(i, j int) bool {
|
||||||
return len(mounts[i]) < len(mounts[j])
|
return len(mounts[i]) < len(mounts[j])
|
||||||
})
|
})
|
||||||
|
@ -28,6 +28,7 @@ import (
|
|||||||
"tailscale.com/ipn/ipnstate"
|
"tailscale.com/ipn/ipnstate"
|
||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/util/mak"
|
"tailscale.com/util/mak"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/version"
|
"tailscale.com/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -439,11 +440,7 @@ func (e *serveEnv) messageForPort(sc *ipn.ServeConfig, st *ipnstate.Status, dnsN
|
|||||||
}
|
}
|
||||||
|
|
||||||
if sc.Web[hp] != nil {
|
if sc.Web[hp] != nil {
|
||||||
var mounts []string
|
mounts := slicesx.MapKeys(sc.Web[hp].Handlers)
|
||||||
|
|
||||||
for k := range sc.Web[hp].Handlers {
|
|
||||||
mounts = append(mounts, k)
|
|
||||||
}
|
|
||||||
sort.Slice(mounts, func(i, j int) bool {
|
sort.Slice(mounts, func(i, j int) bool {
|
||||||
return len(mounts[i]) < len(mounts[j])
|
return len(mounts[i]) < len(mounts[j])
|
||||||
})
|
})
|
||||||
|
@ -202,7 +202,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep
|
|||||||
golang.org/x/crypto/salsa20/salsa from golang.org/x/crypto/nacl/box+
|
golang.org/x/crypto/salsa20/salsa from golang.org/x/crypto/nacl/box+
|
||||||
golang.org/x/crypto/sha3 from crypto/internal/mlkem768+
|
golang.org/x/crypto/sha3 from crypto/internal/mlkem768+
|
||||||
W golang.org/x/exp/constraints from github.com/dblohm7/wingoes/pe+
|
W golang.org/x/exp/constraints from github.com/dblohm7/wingoes/pe+
|
||||||
golang.org/x/exp/maps from tailscale.com/cmd/tailscale/cli+
|
golang.org/x/exp/maps from tailscale.com/util/syspolicy/internal/metrics+
|
||||||
golang.org/x/net/bpf from github.com/mdlayher/netlink+
|
golang.org/x/net/bpf from github.com/mdlayher/netlink+
|
||||||
golang.org/x/net/dns/dnsmessage from net+
|
golang.org/x/net/dns/dnsmessage from net+
|
||||||
golang.org/x/net/http/httpguts from net/http+
|
golang.org/x/net/http/httpguts from net/http+
|
||||||
|
@ -449,7 +449,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
|
|||||||
golang.org/x/crypto/sha3 from crypto/internal/mlkem768+
|
golang.org/x/crypto/sha3 from crypto/internal/mlkem768+
|
||||||
LD golang.org/x/crypto/ssh from github.com/pkg/sftp+
|
LD golang.org/x/crypto/ssh from github.com/pkg/sftp+
|
||||||
golang.org/x/exp/constraints from github.com/dblohm7/wingoes/pe+
|
golang.org/x/exp/constraints from github.com/dblohm7/wingoes/pe+
|
||||||
golang.org/x/exp/maps from tailscale.com/appc+
|
golang.org/x/exp/maps from tailscale.com/ipn/store/mem+
|
||||||
golang.org/x/net/bpf from github.com/mdlayher/genetlink+
|
golang.org/x/net/bpf from github.com/mdlayher/genetlink+
|
||||||
golang.org/x/net/dns/dnsmessage from net+
|
golang.org/x/net/dns/dnsmessage from net+
|
||||||
golang.org/x/net/http/httpguts from golang.org/x/net/http2+
|
golang.org/x/net/http/httpguts from golang.org/x/net/http2+
|
||||||
|
@ -29,8 +29,8 @@ import (
|
|||||||
"github.com/dave/courtney/tester"
|
"github.com/dave/courtney/tester"
|
||||||
"github.com/dave/patsy"
|
"github.com/dave/patsy"
|
||||||
"github.com/dave/patsy/vos"
|
"github.com/dave/patsy/vos"
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"tailscale.com/cmd/testwrapper/flakytest"
|
"tailscale.com/cmd/testwrapper/flakytest"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -350,7 +350,7 @@ func main() {
|
|||||||
if len(toRetry) == 0 {
|
if len(toRetry) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
pkgs := xmaps.Keys(toRetry)
|
pkgs := slicesx.MapKeys(toRetry)
|
||||||
sort.Strings(pkgs)
|
sort.Strings(pkgs)
|
||||||
nextRun := &nextRun{
|
nextRun := &nextRun{
|
||||||
attempt: thisRun.attempt + 1,
|
attempt: thisRun.attempt + 1,
|
||||||
|
@ -38,7 +38,6 @@ import (
|
|||||||
|
|
||||||
"go4.org/mem"
|
"go4.org/mem"
|
||||||
"go4.org/netipx"
|
"go4.org/netipx"
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"golang.org/x/net/dns/dnsmessage"
|
"golang.org/x/net/dns/dnsmessage"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip"
|
"gvisor.dev/gvisor/pkg/tcpip"
|
||||||
"tailscale.com/appc"
|
"tailscale.com/appc"
|
||||||
@ -104,6 +103,7 @@ import (
|
|||||||
"tailscale.com/util/osuser"
|
"tailscale.com/util/osuser"
|
||||||
"tailscale.com/util/rands"
|
"tailscale.com/util/rands"
|
||||||
"tailscale.com/util/set"
|
"tailscale.com/util/set"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/util/syspolicy"
|
"tailscale.com/util/syspolicy"
|
||||||
"tailscale.com/util/syspolicy/rsop"
|
"tailscale.com/util/syspolicy/rsop"
|
||||||
"tailscale.com/util/systemd"
|
"tailscale.com/util/systemd"
|
||||||
@ -2022,7 +2022,7 @@ func (b *LocalBackend) DisablePortMapperForTest() {
|
|||||||
func (b *LocalBackend) PeersForTest() []tailcfg.NodeView {
|
func (b *LocalBackend) PeersForTest() []tailcfg.NodeView {
|
||||||
b.mu.Lock()
|
b.mu.Lock()
|
||||||
defer b.mu.Unlock()
|
defer b.mu.Unlock()
|
||||||
ret := xmaps.Values(b.peers)
|
ret := slicesx.MapValues(b.peers)
|
||||||
slices.SortFunc(ret, func(a, b tailcfg.NodeView) int {
|
slices.SortFunc(ret, func(a, b tailcfg.NodeView) int {
|
||||||
return cmp.Compare(a.ID(), b.ID())
|
return cmp.Compare(a.ID(), b.ID())
|
||||||
})
|
})
|
||||||
@ -7375,9 +7375,9 @@ func suggestExitNode(report *netcheck.Report, netMap *netmap.NetworkMap, prevSug
|
|||||||
// First, try to select an exit node that has the closest DERP home, based on lastReport's DERP latency.
|
// First, try to select an exit node that has the closest DERP home, based on lastReport's DERP latency.
|
||||||
// If there are no latency values, it returns an arbitrary region
|
// If there are no latency values, it returns an arbitrary region
|
||||||
if len(candidatesByRegion) > 0 {
|
if len(candidatesByRegion) > 0 {
|
||||||
minRegion := minLatencyDERPRegion(xmaps.Keys(candidatesByRegion), report)
|
minRegion := minLatencyDERPRegion(slicesx.MapKeys(candidatesByRegion), report)
|
||||||
if minRegion == 0 {
|
if minRegion == 0 {
|
||||||
minRegion = selectRegion(views.SliceOf(xmaps.Keys(candidatesByRegion)))
|
minRegion = selectRegion(views.SliceOf(slicesx.MapKeys(candidatesByRegion)))
|
||||||
}
|
}
|
||||||
regionCandidates, ok := candidatesByRegion[minRegion]
|
regionCandidates, ok := candidatesByRegion[minRegion]
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -7636,5 +7636,5 @@ func vipServicesFromPrefs(prefs ipn.PrefsView) []*tailcfg.VIPService {
|
|||||||
services[s].Active = true
|
services[s].Active = true
|
||||||
}
|
}
|
||||||
|
|
||||||
return slices.Collect(maps.Values(services))
|
return slicesx.MapValues(services)
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"tailscale.com/control/controlknobs"
|
"tailscale.com/control/controlknobs"
|
||||||
"tailscale.com/health"
|
"tailscale.com/health"
|
||||||
"tailscale.com/net/dns/resolver"
|
"tailscale.com/net/dns/resolver"
|
||||||
@ -31,6 +30,7 @@ import (
|
|||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
"tailscale.com/util/clientmetric"
|
"tailscale.com/util/clientmetric"
|
||||||
"tailscale.com/util/dnsname"
|
"tailscale.com/util/dnsname"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -204,7 +204,7 @@ func compileHostEntries(cfg Config) (hosts []*HostEntry) {
|
|||||||
if len(hostsMap) == 0 {
|
if len(hostsMap) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
hosts = xmaps.Values(hostsMap)
|
hosts = slicesx.MapValues(hostsMap)
|
||||||
slices.SortFunc(hosts, func(a, b *HostEntry) int {
|
slices.SortFunc(hosts, func(a, b *HostEntry) int {
|
||||||
if len(a.Hosts) == 0 && len(b.Hosts) == 0 {
|
if len(a.Hosts) == 0 && len(b.Hosts) == 0 {
|
||||||
return 0
|
return 0
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
xmaps "golang.org/x/exp/maps"
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLRU(t *testing.T) {
|
func TestLRU(t *testing.T) {
|
||||||
@ -75,7 +75,7 @@ func TestStressEvictions(t *testing.T) {
|
|||||||
for len(vm) < numKeys {
|
for len(vm) < numKeys {
|
||||||
vm[rand.Uint64()] = true
|
vm[rand.Uint64()] = true
|
||||||
}
|
}
|
||||||
vals := xmaps.Keys(vm)
|
vals := slicesx.MapKeys(vm)
|
||||||
|
|
||||||
c := Cache[uint64, bool]{
|
c := Cache[uint64, bool]{
|
||||||
MaxEntries: cacheSize,
|
MaxEntries: cacheSize,
|
||||||
@ -106,7 +106,7 @@ func TestStressBatchedEvictions(t *testing.T) {
|
|||||||
for len(vm) < numKeys {
|
for len(vm) < numKeys {
|
||||||
vm[rand.Uint64()] = true
|
vm[rand.Uint64()] = true
|
||||||
}
|
}
|
||||||
vals := xmaps.Keys(vm)
|
vals := slicesx.MapKeys(vm)
|
||||||
|
|
||||||
c := Cache[uint64, bool]{}
|
c := Cache[uint64, bool]{}
|
||||||
|
|
||||||
|
@ -148,3 +148,43 @@ func FirstEqual[T comparable](s []T, v T) bool {
|
|||||||
func LastEqual[T comparable](s []T, v T) bool {
|
func LastEqual[T comparable](s []T, v T) bool {
|
||||||
return len(s) > 0 && s[len(s)-1] == v
|
return len(s) > 0 && s[len(s)-1] == v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MapKeys returns the values of the map m.
|
||||||
|
//
|
||||||
|
// The keys will be in an indeterminate order.
|
||||||
|
//
|
||||||
|
// It's equivalent to golang.org/x/exp/maps.Keys, which
|
||||||
|
// unfortunately has the package name "maps", shadowing
|
||||||
|
// the std "maps" package. This version exists for clarity
|
||||||
|
// when reading call sites.
|
||||||
|
//
|
||||||
|
// As opposed to slices.Collect(maps.Keys(m)), this allocates
|
||||||
|
// the returned slice once to exactly the right size, rather than
|
||||||
|
// appending larger backing arrays as it goes.
|
||||||
|
func MapKeys[M ~map[K]V, K comparable, V any](m M) []K {
|
||||||
|
r := make([]K, 0, len(m))
|
||||||
|
for k := range m {
|
||||||
|
r = append(r, k)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
// MapValues returns the values of the map m.
|
||||||
|
//
|
||||||
|
// The values will be in an indeterminate order.
|
||||||
|
//
|
||||||
|
// It's equivalent to golang.org/x/exp/maps.Values, which
|
||||||
|
// unfortunately has the package name "maps", shadowing
|
||||||
|
// the std "maps" package. This version exists for clarity
|
||||||
|
// when reading call sites.
|
||||||
|
//
|
||||||
|
// As opposed to slices.Collect(maps.Values(m)), this allocates
|
||||||
|
// the returned slice once to exactly the right size, rather than
|
||||||
|
// appending larger backing arrays as it goes.
|
||||||
|
func MapValues[M ~map[K]V, K comparable, V any](m M) []V {
|
||||||
|
r := make([]V, 0, len(m))
|
||||||
|
for _, v := range m {
|
||||||
|
r = append(r, v)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
xmaps "golang.org/x/exp/maps"
|
xmaps "golang.org/x/exp/maps"
|
||||||
"tailscale.com/util/mak"
|
"tailscale.com/util/mak"
|
||||||
"tailscale.com/util/set"
|
"tailscale.com/util/set"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/util/syspolicy/internal"
|
"tailscale.com/util/syspolicy/internal"
|
||||||
"tailscale.com/util/syspolicy/setting"
|
"tailscale.com/util/syspolicy/setting"
|
||||||
)
|
)
|
||||||
@ -418,7 +419,7 @@ func (s *TestStore) NotifyPolicyChanged() {
|
|||||||
s.mu.RUnlock()
|
s.mu.RUnlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cbs := xmaps.Values(s.cbs)
|
cbs := slicesx.MapValues(s.cbs)
|
||||||
s.mu.RUnlock()
|
s.mu.RUnlock()
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
@ -18,7 +18,6 @@ import (
|
|||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
"github.com/google/go-cmp/cmp/cmpopts"
|
"github.com/google/go-cmp/cmp/cmpopts"
|
||||||
"go4.org/netipx"
|
"go4.org/netipx"
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"tailscale.com/net/flowtrack"
|
"tailscale.com/net/flowtrack"
|
||||||
"tailscale.com/net/ipset"
|
"tailscale.com/net/ipset"
|
||||||
"tailscale.com/net/packet"
|
"tailscale.com/net/packet"
|
||||||
@ -30,6 +29,7 @@ import (
|
|||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
"tailscale.com/types/views"
|
"tailscale.com/types/views"
|
||||||
"tailscale.com/util/must"
|
"tailscale.com/util/must"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/wgengine/filter/filtertype"
|
"tailscale.com/wgengine/filter/filtertype"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -997,7 +997,7 @@ func TestPeerCaps(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
got := xmaps.Keys(filt.CapsWithValues(netip.MustParseAddr(tt.src), netip.MustParseAddr(tt.dst)))
|
got := slicesx.MapKeys(filt.CapsWithValues(netip.MustParseAddr(tt.src), netip.MustParseAddr(tt.dst)))
|
||||||
slices.Sort(got)
|
slices.Sort(got)
|
||||||
slices.Sort(tt.want)
|
slices.Sort(tt.want)
|
||||||
if !slices.Equal(got, tt.want) {
|
if !slices.Equal(got, tt.want) {
|
||||||
|
@ -21,7 +21,6 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"golang.org/x/net/ipv4"
|
"golang.org/x/net/ipv4"
|
||||||
"golang.org/x/net/ipv6"
|
"golang.org/x/net/ipv6"
|
||||||
"tailscale.com/disco"
|
"tailscale.com/disco"
|
||||||
@ -34,6 +33,7 @@ import (
|
|||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
"tailscale.com/util/mak"
|
"tailscale.com/util/mak"
|
||||||
"tailscale.com/util/ringbuffer"
|
"tailscale.com/util/ringbuffer"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
)
|
)
|
||||||
|
|
||||||
var mtuProbePingSizesV4 []int
|
var mtuProbePingSizesV4 []int
|
||||||
@ -587,7 +587,7 @@ func (de *endpoint) addrForWireGuardSendLocked(now mono.Time) (udpAddr netip.Add
|
|||||||
needPing := len(de.endpointState) > 1 && now.Sub(oldestPing) > wireguardPingInterval
|
needPing := len(de.endpointState) > 1 && now.Sub(oldestPing) > wireguardPingInterval
|
||||||
|
|
||||||
if !udpAddr.IsValid() {
|
if !udpAddr.IsValid() {
|
||||||
candidates := xmaps.Keys(de.endpointState)
|
candidates := slicesx.MapKeys(de.endpointState)
|
||||||
|
|
||||||
// Randomly select an address to use until we retrieve latency information
|
// Randomly select an address to use until we retrieve latency information
|
||||||
// and give it a short trustBestAddrUntil time so we avoid flapping between
|
// and give it a short trustBestAddrUntil time so we avoid flapping between
|
||||||
|
@ -33,7 +33,6 @@ import (
|
|||||||
"github.com/tailscale/wireguard-go/device"
|
"github.com/tailscale/wireguard-go/device"
|
||||||
"github.com/tailscale/wireguard-go/tun/tuntest"
|
"github.com/tailscale/wireguard-go/tun/tuntest"
|
||||||
"go4.org/mem"
|
"go4.org/mem"
|
||||||
xmaps "golang.org/x/exp/maps"
|
|
||||||
"golang.org/x/net/icmp"
|
"golang.org/x/net/icmp"
|
||||||
"golang.org/x/net/ipv4"
|
"golang.org/x/net/ipv4"
|
||||||
"tailscale.com/cmd/testwrapper/flakytest"
|
"tailscale.com/cmd/testwrapper/flakytest"
|
||||||
@ -66,6 +65,7 @@ import (
|
|||||||
"tailscale.com/util/must"
|
"tailscale.com/util/must"
|
||||||
"tailscale.com/util/racebuild"
|
"tailscale.com/util/racebuild"
|
||||||
"tailscale.com/util/set"
|
"tailscale.com/util/set"
|
||||||
|
"tailscale.com/util/slicesx"
|
||||||
"tailscale.com/util/usermetric"
|
"tailscale.com/util/usermetric"
|
||||||
"tailscale.com/wgengine/filter"
|
"tailscale.com/wgengine/filter"
|
||||||
"tailscale.com/wgengine/wgcfg"
|
"tailscale.com/wgengine/wgcfg"
|
||||||
@ -1133,7 +1133,7 @@ func testTwoDevicePing(t *testing.T, d *devices) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
t.Helper()
|
t.Helper()
|
||||||
t.Errorf("missing any connection to %s from %s", wantConns, xmaps.Keys(stats))
|
t.Errorf("missing any connection to %s from %s", wantConns, slicesx.MapKeys(stats))
|
||||||
}
|
}
|
||||||
|
|
||||||
addrPort := netip.MustParseAddrPort
|
addrPort := netip.MustParseAddrPort
|
||||||
|
Loading…
x
Reference in New Issue
Block a user