Skip to content

Commit 1f0f310

Browse files
committed
review comments
1 parent 790ff93 commit 1f0f310

11 files changed

Lines changed: 345 additions & 339 deletions

File tree

.golangci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ linters:
88
- revive
99
- unused
1010
- prealloc
11+
disable:
12+
- errcheck
1113

1214
settings:
1315
revive:

p2p/host/basic/addrs_manager.go

Lines changed: 61 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type hostAddrs struct {
3434
localAddrs []ma.Multiaddr
3535
reachableAddrs []ma.Multiaddr
3636
unreachableAddrs []ma.Multiaddr
37+
relayAddrs []ma.Multiaddr
3738
}
3839

3940
type addrsManager struct {
@@ -56,11 +57,8 @@ type addrsManager struct {
5657

5758
hostReachability atomic.Pointer[network.Reachability]
5859

59-
addrsMx sync.RWMutex // protects fields below
60+
addrsMx sync.RWMutex
6061
currentAddrs hostAddrs
61-
// relayAddrs are the host's relay addresses. Kept separate from hostAddrs as we
62-
// update them differently from hostAddrs.
63-
relayAddrs []ma.Multiaddr
6462

6563
wg sync.WaitGroup
6664
ctx context.Context
@@ -140,7 +138,7 @@ func (a *addrsManager) NetNotifee() network.Notifiee {
140138
}
141139

142140
func (a *addrsManager) triggerAddrsUpdate() {
143-
a.updateAddrs()
141+
a.updateAddrs(false, nil)
144142
select {
145143
case a.triggerAddrsUpdateChan <- struct{}{}:
146144
default:
@@ -177,11 +175,12 @@ func (a *addrsManager) startBackgroundWorker() error {
177175
return errors.Join(err, err1, err2)
178176
}
179177

178+
var relayAddrs []ma.Multiaddr
180179
// update relay addrs in case we're private
181180
select {
182181
case e := <-autoRelayAddrsSub.Out():
183182
if evt, ok := e.(event.EvtAutoRelayAddrsUpdated); ok {
184-
a.updateRelayAddrs(evt.RelayAddrs)
183+
relayAddrs = slices.Clone(evt.RelayAddrs)
185184
}
186185
default:
187186
}
@@ -195,24 +194,23 @@ func (a *addrsManager) startBackgroundWorker() error {
195194
}
196195
// update addresses before starting the worker loop. This ensures that any address updates
197196
// before calling addrsManager.Start are correctly reported after Start returns.
198-
a.updateAddrs()
197+
a.updateAddrs(true, relayAddrs)
198+
199199
a.wg.Add(1)
200-
go func() {
201-
defer a.wg.Done()
202-
a.background(autoRelayAddrsSub, autonatReachabilitySub, emitter)
203-
}()
200+
go a.background(autoRelayAddrsSub, autonatReachabilitySub, emitter, relayAddrs)
204201
return nil
205202
}
206203

207-
func (a *addrsManager) background(autoRelayAddrsSub, autonatReachabilitySub event.Subscription, emitter event.Emitter) {
204+
func (a *addrsManager) background(autoRelayAddrsSub, autonatReachabilitySub event.Subscription,
205+
emitter event.Emitter, relayAddrs []ma.Multiaddr,
206+
) {
207+
defer a.wg.Done()
208208
defer func() {
209209
err := autoRelayAddrsSub.Close()
210210
if err != nil {
211211
log.Warnf("error closing auto relay addrs sub: %s", err)
212212
}
213-
}()
214-
defer func() {
215-
err := autonatReachabilitySub.Close()
213+
err = autonatReachabilitySub.Close()
216214
if err != nil {
217215
log.Warnf("error closing autonat reachability sub: %s", err)
218216
}
@@ -222,7 +220,7 @@ func (a *addrsManager) background(autoRelayAddrsSub, autonatReachabilitySub even
222220
defer ticker.Stop()
223221
var previousAddrs hostAddrs
224222
for {
225-
currAddrs := a.updateAddrs()
223+
currAddrs := a.updateAddrs(true, relayAddrs)
226224
a.notifyAddrsChanged(emitter, previousAddrs, currAddrs)
227225
previousAddrs = currAddrs
228226
select {
@@ -231,7 +229,7 @@ func (a *addrsManager) background(autoRelayAddrsSub, autonatReachabilitySub even
231229
case <-a.triggerReachabilityUpdate:
232230
case e := <-autoRelayAddrsSub.Out():
233231
if evt, ok := e.(event.EvtAutoRelayAddrsUpdated); ok {
234-
a.updateRelayAddrs(evt.RelayAddrs)
232+
relayAddrs = slices.Clone(evt.RelayAddrs)
235233
}
236234
case e := <-autonatReachabilitySub.Out():
237235
if evt, ok := e.(event.EvtLocalReachabilityChanged); ok {
@@ -243,7 +241,9 @@ func (a *addrsManager) background(autoRelayAddrsSub, autonatReachabilitySub even
243241
}
244242
}
245243

246-
func (a *addrsManager) updateAddrs() hostAddrs {
244+
// updateAddrs updates the addresses of the host and returns the new updated
245+
// addrs
246+
func (a *addrsManager) updateAddrs(updateRelayAddrs bool, relayAddrs []ma.Multiaddr) hostAddrs {
247247
// Must lock while doing both recompute and update as this method is called from
248248
// multiple goroutines.
249249
a.addrsMx.Lock()
@@ -254,29 +254,31 @@ func (a *addrsManager) updateAddrs() hostAddrs {
254254
if a.addrsReachabilityTracker != nil {
255255
currReachableAddrs, currUnreachableAddrs = a.getConfirmedAddrs(localAddrs)
256256
}
257-
currAddrs := a.getAddrs(slices.Clone(localAddrs), a.getRelayAddrsUnlocked())
257+
if !updateRelayAddrs {
258+
relayAddrs = a.currentAddrs.relayAddrs
259+
} else {
260+
// Copy the callers slice
261+
relayAddrs = slices.Clone(relayAddrs)
262+
}
263+
currAddrs := a.getAddrs(slices.Clone(localAddrs), relayAddrs)
258264

259265
a.currentAddrs = hostAddrs{
260266
addrs: append(a.currentAddrs.addrs[:0], currAddrs...),
261267
localAddrs: append(a.currentAddrs.localAddrs[:0], localAddrs...),
262268
reachableAddrs: append(a.currentAddrs.reachableAddrs[:0], currReachableAddrs...),
263269
unreachableAddrs: append(a.currentAddrs.unreachableAddrs[:0], currUnreachableAddrs...),
270+
relayAddrs: append(a.currentAddrs.relayAddrs[:0], relayAddrs...),
264271
}
265272

266273
return hostAddrs{
267274
localAddrs: localAddrs,
268275
addrs: currAddrs,
269276
reachableAddrs: currReachableAddrs,
270277
unreachableAddrs: currUnreachableAddrs,
278+
relayAddrs: relayAddrs,
271279
}
272280
}
273281

274-
func (a *addrsManager) updateRelayAddrs(addrs []ma.Multiaddr) {
275-
a.addrsMx.Lock()
276-
defer a.addrsMx.Unlock()
277-
a.relayAddrs = append(a.relayAddrs[:0], addrs...)
278-
}
279-
280282
func (a *addrsManager) notifyAddrsChanged(emitter event.Emitter, previous, current hostAddrs) {
281283
if areAddrsDifferent(previous.localAddrs, current.localAddrs) {
282284
log.Debugf("host local addresses updated: %s", current.localAddrs)
@@ -308,7 +310,11 @@ func (a *addrsManager) notifyAddrsChanged(emitter event.Emitter, previous, curre
308310
// If autorelay is enabled and node reachability is private, it returns
309311
// the node's relay addresses and private network addresses.
310312
func (a *addrsManager) Addrs() []ma.Multiaddr {
311-
return a.getAddrs(a.DirectAddrs(), a.RelayAddrs())
313+
a.addrsMx.RLock()
314+
directAddrs := slices.Clone(a.currentAddrs.localAddrs)
315+
relayAddrs := slices.Clone(a.currentAddrs.relayAddrs)
316+
a.addrsMx.RUnlock()
317+
return a.getAddrs(directAddrs, relayAddrs)
312318
}
313319

314320
// getAddrs returns the node's dialable addresses. Mutates localAddrs
@@ -358,48 +364,9 @@ func (a *addrsManager) ReachableAddrs() []ma.Multiaddr {
358364
return slices.Clone(a.currentAddrs.reachableAddrs)
359365
}
360366

361-
// RelayAddrs returns all the relay addresses of the host.
362-
func (a *addrsManager) RelayAddrs() []ma.Multiaddr {
363-
a.addrsMx.RLock()
364-
defer a.addrsMx.RUnlock()
365-
return a.getRelayAddrsUnlocked()
366-
}
367-
368-
func (a *addrsManager) getRelayAddrsUnlocked() []ma.Multiaddr {
369-
return slices.Clone(a.relayAddrs)
370-
}
371-
372367
func (a *addrsManager) getConfirmedAddrs(localAddrs []ma.Multiaddr) (reachableAddrs, unreachableAddrs []ma.Multiaddr) {
373368
reachableAddrs, unreachableAddrs = a.addrsReachabilityTracker.ConfirmedAddrs()
374-
return removeIfNotInSource(reachableAddrs, localAddrs), removeIfNotInSource(unreachableAddrs, localAddrs)
375-
}
376-
377-
// removeIfNotInSource removes items from addrs that are not present in source.
378-
// Modifies the addrs slice in place
379-
// addrs and source must be sorted using multiaddr.Compare.
380-
func removeIfNotInSource(addrs, source []ma.Multiaddr) []ma.Multiaddr {
381-
j := 0
382-
// mark entries not in source as nil
383-
for i, a := range addrs {
384-
// move right till a is greater
385-
for j < len(source) && a.Compare(source[j]) > 0 {
386-
j++
387-
}
388-
// a is not in source if we've reached the end, or a is lesser
389-
if j == len(source) || a.Compare(source[j]) < 0 {
390-
addrs[i] = nil
391-
}
392-
// a is in source, nothing to do
393-
}
394-
// j is the current element, i is the lowest index nil element
395-
i := 0
396-
for j := 0; j < len(addrs); j++ {
397-
if addrs[j] != nil {
398-
addrs[i], addrs[j] = addrs[j], addrs[i]
399-
i++
400-
}
401-
}
402-
return addrs[:i]
369+
return removeNotInSource(reachableAddrs, localAddrs), removeNotInSource(unreachableAddrs, localAddrs)
403370
}
404371

405372
var p2pCircuitAddr = ma.StringCast("/p2p-circuit")
@@ -701,3 +668,31 @@ func (i *interfaceAddrsCache) updateUnlocked() {
701668
}
702669
}
703670
}
671+
672+
// removeNotInSource removes items from addrs that are not present in source.
673+
// Modifies the addrs slice in place
674+
// addrs and source must be sorted using multiaddr.Compare.
675+
func removeNotInSource(addrs, source []ma.Multiaddr) []ma.Multiaddr {
676+
j := 0
677+
// mark entries not in source as nil
678+
for i, a := range addrs {
679+
// move right till a is greater
680+
for j < len(source) && a.Compare(source[j]) > 0 {
681+
j++
682+
}
683+
// a is not in source if we've reached the end, or a is lesser
684+
if j == len(source) || a.Compare(source[j]) < 0 {
685+
addrs[i] = nil
686+
}
687+
// a is in source, nothing to do
688+
}
689+
// j is the current element, i is the lowest index nil element
690+
i := 0
691+
for j := range len(addrs) {
692+
if addrs[j] != nil {
693+
addrs[i], addrs[j] = addrs[j], addrs[i]
694+
i++
695+
}
696+
}
697+
return addrs[:i]
698+
}

p2p/host/basic/addrs_manager_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestAppendNATAddrs(t *testing.T) {
3434
// nat mapping success, obsaddress ignored
3535
Listen: ma.StringCast("/ip4/0.0.0.0/udp/1/quic-v1"),
3636
Nat: ma.StringCast("/ip4/1.1.1.1/udp/10/quic-v1"),
37-
ObsAddrFunc: func(m ma.Multiaddr) []ma.Multiaddr {
37+
ObsAddrFunc: func(_ ma.Multiaddr) []ma.Multiaddr {
3838
return []ma.Multiaddr{ma.StringCast("/ip4/2.2.2.2/udp/100/quic-v1")}
3939
},
4040
Expected: []ma.Multiaddr{ma.StringCast("/ip4/1.1.1.1/udp/10/quic-v1")},
@@ -120,7 +120,7 @@ func TestAppendNATAddrs(t *testing.T) {
120120
t.Run(tc.Name, func(t *testing.T) {
121121
as := &addrsManager{
122122
natManager: &mockNatManager{
123-
GetMappingFunc: func(addr ma.Multiaddr) ma.Multiaddr {
123+
GetMappingFunc: func(_ ma.Multiaddr) ma.Multiaddr {
124124
return tc.Nat
125125
},
126126
},
@@ -139,7 +139,7 @@ type mockNatManager struct {
139139
GetMappingFunc func(addr ma.Multiaddr) ma.Multiaddr
140140
}
141141

142-
func (m *mockNatManager) Close() error {
142+
func (*mockNatManager) Close() error {
143143
return nil
144144
}
145145

@@ -150,7 +150,7 @@ func (m *mockNatManager) GetMapping(addr ma.Multiaddr) ma.Multiaddr {
150150
return m.GetMappingFunc(addr)
151151
}
152152

153-
func (m *mockNatManager) HasDiscoveredNAT() bool {
153+
func (*mockNatManager) HasDiscoveredNAT() bool {
154154
return true
155155
}
156156

@@ -336,7 +336,7 @@ func TestAddrsManager(t *testing.T) {
336336
}
337337
am := newAddrsManagerTestCase(t, addrsManagerArgs{
338338
ObservedAddrsManager: &mockObservedAddrs{
339-
ObservedAddrsForFunc: func(addr ma.Multiaddr) []ma.Multiaddr {
339+
ObservedAddrsForFunc: func(_ ma.Multiaddr) []ma.Multiaddr {
340340
return quicAddrs
341341
},
342342
},
@@ -352,7 +352,7 @@ func TestAddrsManager(t *testing.T) {
352352
t.Run("public addrs removed when private", func(t *testing.T) {
353353
am := newAddrsManagerTestCase(t, addrsManagerArgs{
354354
ObservedAddrsManager: &mockObservedAddrs{
355-
ObservedAddrsForFunc: func(addr ma.Multiaddr) []ma.Multiaddr {
355+
ObservedAddrsForFunc: func(_ ma.Multiaddr) []ma.Multiaddr {
356356
return []ma.Multiaddr{publicQUIC}
357357
},
358358
},
@@ -394,7 +394,7 @@ func TestAddrsManager(t *testing.T) {
394394
return nil
395395
},
396396
ObservedAddrsManager: &mockObservedAddrs{
397-
ObservedAddrsForFunc: func(addr ma.Multiaddr) []ma.Multiaddr {
397+
ObservedAddrsForFunc: func(_ ma.Multiaddr) []ma.Multiaddr {
398398
return []ma.Multiaddr{publicQUIC}
399399
},
400400
},
@@ -414,7 +414,7 @@ func TestAddrsManager(t *testing.T) {
414414
t.Run("updates addresses on signaling", func(t *testing.T) {
415415
updateChan := make(chan struct{})
416416
am := newAddrsManagerTestCase(t, addrsManagerArgs{
417-
AddrsFactory: func(addrs []ma.Multiaddr) []ma.Multiaddr {
417+
AddrsFactory: func(_ []ma.Multiaddr) []ma.Multiaddr {
418418
select {
419419
case <-updateChan:
420420
return []ma.Multiaddr{publicQUIC}
@@ -451,7 +451,7 @@ func TestAddrsManagerReachabilityEvent(t *testing.T) {
451451
// currently they aren't being passed to the reachability tracker
452452
ListenAddrs: func() []ma.Multiaddr { return []ma.Multiaddr{publicQUIC, publicQUIC2, publicTCP} },
453453
AutoNATClient: mockAutoNATClient{
454-
F: func(ctx context.Context, reqs []autonatv2.Request) (autonatv2.Result, error) {
454+
F: func(_ context.Context, reqs []autonatv2.Request) (autonatv2.Result, error) {
455455
if reqs[0].Addr.Equal(publicQUIC) {
456456
return autonatv2.Result{Addr: reqs[0].Addr, Idx: 0, Reachability: network.ReachabilityPublic}, nil
457457
} else if reqs[0].Addr.Equal(publicTCP) || reqs[0].Addr.Equal(publicQUIC2) {
@@ -496,7 +496,7 @@ func TestRemoveIfNotInSource(t *testing.T) {
496496
}
497497
for i, tc := range cases {
498498
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
499-
addrs := removeIfNotInSource(tc.addrs, tc.source)
499+
addrs := removeNotInSource(tc.addrs, tc.source)
500500
require.ElementsMatch(t, tc.expected, addrs, "%s\n%s", tc.expected, tc.addrs)
501501
})
502502
}
@@ -524,6 +524,6 @@ func BenchmarkRemoveIfNotInSource(b *testing.B) {
524524
b.ReportAllocs()
525525
b.ResetTimer()
526526
for i := 0; i < b.N; i++ {
527-
removeIfNotInSource(slices.Clone(addrs[:5]), addrs[:])
527+
removeNotInSource(slices.Clone(addrs[:5]), addrs[:])
528528
}
529529
}

0 commit comments

Comments
 (0)