syncs: delete Map.Range, update callers to iterators

Updates #11038

Change-Id: I2819fed896cc4035aba5e4e141b52c12637373b1
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2024-10-09 13:48:18 -07:00 committed by Brad Fitzpatrick
parent 2cadb80fb2
commit c763b7a7db
5 changed files with 11 additions and 32 deletions

View File

@ -253,22 +253,6 @@ func (m *Map[K, V]) Delete(key K) {
delete(m.m, key)
}
// Range iterates over the map in an undefined order calling f for each entry.
// Iteration stops if f returns false. Map changes are blocked during iteration.
// A read lock is held for the entire duration of the iteration.
// Use the [WithLock] method instead to mutate the map during iteration.
//
// Deprecated: Use [All], [Keys], or [Values] instead.
func (m *Map[K, V]) Range(f func(key K, value V) bool) {
m.mu.RLock()
defer m.mu.RUnlock()
for k, v := range m.m {
if !f(k, v) {
return
}
}
}
// Keys iterates over all keys in the map in an undefined order.
// A read lock is held for the entire duration of the iteration.
// Use the [WithLock] method instead to mutate the map during iteration.

View File

@ -160,10 +160,9 @@ func TestMap(t *testing.T) {
}
got := map[string]int{}
want := map[string]int{"one": 1, "two": 2, "three": 3}
m.Range(func(k string, v int) bool {
for k, v := range m.All() {
got[k] = v
return true
})
}
if d := cmp.Diff(got, want); d != "" {
t.Errorf("Range mismatch (-got +want):\n%s", d)
}
@ -178,10 +177,9 @@ func TestMap(t *testing.T) {
m.Delete("noexist")
got = map[string]int{}
want = map[string]int{}
m.Range(func(k string, v int) bool {
for k, v := range m.All() {
got[k] = v
return true
})
}
if d := cmp.Diff(got, want); d != "" {
t.Errorf("Range mismatch (-got +want):\n%s", d)
}

View File

@ -226,7 +226,7 @@ func (m *Manager) IncomingFiles() []ipn.PartialFile {
// in JSON to clients. They distinguish between empty and non-nil
// to know whether a Notify should be able about files.
files := make([]ipn.PartialFile, 0)
m.incomingFiles.Range(func(k incomingFileKey, f *incomingFile) bool {
for k, f := range m.incomingFiles.All() {
f.mu.Lock()
defer f.mu.Unlock()
files = append(files, ipn.PartialFile{
@ -238,8 +238,7 @@ func (m *Manager) IncomingFiles() []ipn.PartialFile {
FinalPath: f.finalPath,
Done: f.done,
})
return true
})
}
return files
}

View File

@ -974,13 +974,12 @@ func (n *network) writeEth(res []byte) bool {
if dstMAC.IsBroadcast() || (n.v6 && etherType == layers.EthernetTypeIPv6 && dstMAC == macAllNodes) {
num := 0
n.writers.Range(func(mac MAC, nw networkWriter) bool {
for mac, nw := range n.writers.All() {
if mac != srcMAC {
num++
nw.write(res)
}
return true
})
}
return num > 0
}
if srcMAC == dstMAC {

View File

@ -414,15 +414,14 @@ func init() {
// endpoint, and name collisions will result in Prometheus scraping errors.
clientmetric.NewCounterFunc("netstack_tcp_forward_dropped_attempts", func() int64 {
var total uint64
stacksForMetrics.Range(func(ns *Impl, _ struct{}) bool {
for ns := range stacksForMetrics.Keys() {
delta := ns.ipstack.Stats().TCP.ForwardMaxInFlightDrop.Value()
if total+delta > math.MaxInt64 {
total = math.MaxInt64
return false
break
}
total += delta
return true
})
}
return int64(total)
})
}