summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2025-08-28 14:09:01 -0700
committerBrad Fitzpatrick <brad@danga.com>2025-08-28 22:35:24 -0700
commit3aea0e095a411cc98f3ad0b7c1706a00ca7662b0 (patch)
tree48126dc72baa9d70243550bcca68c79fb02d3f98
parentf5d3c59a925b2f0ea249a32ddc0decdb43ff7ee9 (diff)
downloadtailscale-3aea0e095a411cc98f3ad0b7c1706a00ca7662b0.tar.xz
tailscale-3aea0e095a411cc98f3ad0b7c1706a00ca7662b0.zip
syncs: delete WaitGroup and use sync.WaitGroup.Go in Go 1.25
Our own WaitGroup wrapper type was a prototype implementation for the Go method on the standard sync.WaitGroup type. Now that there is first-class support for Go, we should migrate over to using it and delete syncs.WaitGroup. Updates #cleanup Updates tailscale/tailscale#16330 Change-Id: Ib52b10f9847341ce29b4ca0da927dc9321691235 Signed-off-by: Joe Tsai <joetsai@digital-static.net>
-rw-r--r--cmd/containerboot/egressservices.go5
-rw-r--r--cmd/tailscale/cli/file.go4
-rw-r--r--cmd/tailscale/depaware.txt2
-rw-r--r--feature/taildrop/delete.go3
-rw-r--r--syncs/syncs.go16
-rw-r--r--syncs/syncs_test.go5
6 files changed, 9 insertions, 26 deletions
diff --git a/cmd/containerboot/egressservices.go b/cmd/containerboot/egressservices.go
index 71141f17a..64ca0a13a 100644
--- a/cmd/containerboot/egressservices.go
+++ b/cmd/containerboot/egressservices.go
@@ -18,6 +18,7 @@ import (
"reflect"
"strconv"
"strings"
+ "sync"
"time"
"github.com/fsnotify/fsnotify"
@@ -26,7 +27,6 @@ import (
"tailscale.com/kube/egressservices"
"tailscale.com/kube/kubeclient"
"tailscale.com/kube/kubetypes"
- "tailscale.com/syncs"
"tailscale.com/tailcfg"
"tailscale.com/util/httpm"
"tailscale.com/util/linuxfw"
@@ -666,8 +666,7 @@ func (ep *egressProxy) waitTillSafeToShutdown(ctx context.Context, cfgs *egresss
return
}
log.Printf("Ensuring that cluster traffic for egress targets is no longer routed via this Pod...")
- wg := syncs.WaitGroup{}
-
+ var wg sync.WaitGroup
for s, cfg := range *cfgs {
hep := cfg.HealthCheckEndpoint
if hep == "" {
diff --git a/cmd/tailscale/cli/file.go b/cmd/tailscale/cli/file.go
index 6f3aa40b5..e0879197e 100644
--- a/cmd/tailscale/cli/file.go
+++ b/cmd/tailscale/cli/file.go
@@ -20,6 +20,7 @@ import (
"path"
"path/filepath"
"strings"
+ "sync"
"sync/atomic"
"time"
"unicode/utf8"
@@ -32,7 +33,6 @@ import (
"tailscale.com/envknob"
"tailscale.com/ipn/ipnstate"
"tailscale.com/net/tsaddr"
- "tailscale.com/syncs"
"tailscale.com/tailcfg"
tsrate "tailscale.com/tstime/rate"
"tailscale.com/util/quarantine"
@@ -176,7 +176,7 @@ func runCp(ctx context.Context, args []string) error {
log.Printf("sending %q to %v/%v/%v ...", name, target, ip, stableID)
}
- var group syncs.WaitGroup
+ var group sync.WaitGroup
ctxProgress, cancelProgress := context.WithCancel(ctx)
defer cancelProgress()
if isatty.IsTerminal(os.Stderr.Fd()) {
diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt
index b121a411f..02ffec0ea 100644
--- a/cmd/tailscale/depaware.txt
+++ b/cmd/tailscale/depaware.txt
@@ -140,7 +140,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep
💣 tailscale.com/net/tshttpproxy from tailscale.com/clientupdate/distsign+
tailscale.com/paths from tailscale.com/client/local+
💣 tailscale.com/safesocket from tailscale.com/client/local+
- tailscale.com/syncs from tailscale.com/cmd/tailscale/cli+
+ tailscale.com/syncs from tailscale.com/control/controlhttp+
tailscale.com/tailcfg from tailscale.com/client/local+
tailscale.com/tempfork/spf13/cobra from tailscale.com/cmd/tailscale/cli/ffcomplete+
tailscale.com/tka from tailscale.com/client/local+
diff --git a/feature/taildrop/delete.go b/feature/taildrop/delete.go
index 0b7259879..8b03a125f 100644
--- a/feature/taildrop/delete.go
+++ b/feature/taildrop/delete.go
@@ -12,7 +12,6 @@ import (
"time"
"tailscale.com/ipn"
- "tailscale.com/syncs"
"tailscale.com/tstime"
"tailscale.com/types/logger"
)
@@ -33,7 +32,7 @@ type fileDeleter struct {
byName map[string]*list.Element
emptySignal chan struct{} // signal that the queue is empty
- group syncs.WaitGroup
+ group sync.WaitGroup
shutdownCtx context.Context
shutdown context.CancelFunc
fs FileOps // must be used for all filesystem operations
diff --git a/syncs/syncs.go b/syncs/syncs.go
index cf0be919b..e85b474c9 100644
--- a/syncs/syncs.go
+++ b/syncs/syncs.go
@@ -402,19 +402,3 @@ func (m *Map[K, V]) Swap(key K, value V) (oldValue V) {
mak.Set(&m.m, key, value)
return oldValue
}
-
-// WaitGroup is identical to [sync.WaitGroup],
-// but provides a Go method to start a goroutine.
-type WaitGroup struct{ sync.WaitGroup }
-
-// Go calls the given function in a new goroutine.
-// It automatically increments the counter before execution and
-// automatically decrements the counter after execution.
-// It must not be called concurrently with Wait.
-func (wg *WaitGroup) Go(f func()) {
- wg.Add(1)
- go func() {
- defer wg.Done()
- f()
- }()
-}
diff --git a/syncs/syncs_test.go b/syncs/syncs_test.go
index 2439b6068..d99c3d1a9 100644
--- a/syncs/syncs_test.go
+++ b/syncs/syncs_test.go
@@ -7,6 +7,7 @@ import (
"context"
"io"
"os"
+ "sync"
"testing"
"time"
@@ -98,7 +99,7 @@ func TestMutexValue(t *testing.T) {
t.Errorf("Load = %v, want %v", v.Load(), now)
}
- var group WaitGroup
+ var group sync.WaitGroup
var v2 MutexValue[int]
var sum int
for i := range 10 {
@@ -237,7 +238,7 @@ func TestMap(t *testing.T) {
t.Run("LoadOrStore", func(t *testing.T) {
var m Map[string, string]
- var wg WaitGroup
+ var wg sync.WaitGroup
var ok1, ok2 bool
wg.Go(func() { _, ok1 = m.LoadOrStore("", "") })
wg.Go(func() { _, ok2 = m.LoadOrStore("", "") })