Skip to content

Commit d2c7a7b

Browse files
authored
Merge branch 'main' into do-not-warn-known-headers
2 parents 95f2931 + 6afe95f commit d2c7a7b

File tree

2 files changed

+57
-25
lines changed

2 files changed

+57
-25
lines changed

p2p/peer_tracker.go

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package p2p
22

33
import (
44
"context"
5+
"sort"
56
"sync"
67
"time"
78

@@ -15,8 +16,10 @@ import (
1516
const (
1617
// defaultScore specifies the score for newly connected peers.
1718
defaultScore float32 = 1
18-
// maxTrackerSize specifies the max amount of peers that can be added to the peerTracker.
19+
// maxPeerTrackerSize specifies the max amount of peers that can be added to the peerTracker.
1920
maxPeerTrackerSize = 100
21+
// minPeerTrackerSizeBeforeGC specifies the minimum amount of tracked peers before the peerTracker starts removing peers with lower peer scores.
22+
minPeerTrackerSizeBeforeGC = 10
2023
)
2124

2225
var (
@@ -240,31 +243,53 @@ func (p *peerTracker) gc() {
240243
p.done <- struct{}{}
241244
return
242245
case <-ticker.C:
243-
p.peerLk.Lock()
244-
245-
now := time.Now()
246-
var deletedDisconnectedNum int
247-
for id, peer := range p.disconnectedPeers {
248-
if peer.pruneDeadline.Before(now) {
249-
delete(p.disconnectedPeers, id)
250-
deletedDisconnectedNum++
251-
}
252-
}
246+
p.cleanUpDisconnectedPeers()
247+
p.cleanUpTrackedPeers()
248+
p.dumpPeers(p.ctx)
249+
}
250+
}
251+
}
253252

254-
var deletedTrackedNum int
255-
for id, peer := range p.trackedPeers {
256-
if peer.peerScore <= defaultScore {
257-
delete(p.trackedPeers, id)
258-
deletedTrackedNum++
259-
}
260-
}
261-
p.peerLk.Unlock()
253+
func (p *peerTracker) cleanUpDisconnectedPeers() {
254+
p.peerLk.Lock()
255+
defer p.peerLk.Unlock()
262256

263-
p.metrics.peersDisconnected(-deletedDisconnectedNum)
264-
p.metrics.peersTracked(-deletedTrackedNum)
265-
p.dumpPeers(p.ctx)
257+
now := time.Now()
258+
var deletedDisconnectedNum int
259+
for id, peer := range p.disconnectedPeers {
260+
if peer.pruneDeadline.Before(now) {
261+
delete(p.disconnectedPeers, id)
262+
deletedDisconnectedNum++
263+
}
264+
}
265+
p.metrics.peersDisconnected(-deletedDisconnectedNum)
266+
}
267+
268+
func (p *peerTracker) cleanUpTrackedPeers() {
269+
p.peerLk.Lock()
270+
defer p.peerLk.Unlock()
271+
272+
if len(p.trackedPeers) <= minPeerTrackerSizeBeforeGC {
273+
return
274+
}
275+
276+
var deletedTrackedNum int
277+
orderedPeers := make([]*peerStat, 0, len(p.trackedPeers))
278+
for _, peer := range p.trackedPeers {
279+
orderedPeers = append(orderedPeers, peer)
280+
}
281+
sort.Slice(orderedPeers, func(i, j int) bool {
282+
return orderedPeers[i].peerScore < orderedPeers[j].peerScore
283+
})
284+
285+
for _, peer := range orderedPeers[:len(orderedPeers)-minPeerTrackerSizeBeforeGC] {
286+
if peer.peerScore > defaultScore {
287+
break
266288
}
289+
delete(p.trackedPeers, peer.peerID)
290+
deletedTrackedNum++
267291
}
292+
p.metrics.peersTracked(-deletedTrackedNum)
268293
}
269294

270295
// dumpPeers stores peers to the peerTracker's PeerIDStore if

p2p/peer_tracker_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@ func TestPeerTracker_GC(t *testing.T) {
3333

3434
maxAwaitingTime = time.Millisecond
3535

36-
peerlist := generateRandomPeerlist(t, 4)
36+
peerlist := generateRandomPeerlist(t, minPeerTrackerSizeBeforeGC)
37+
for i := 0; i < minPeerTrackerSizeBeforeGC; i++ {
38+
p.trackedPeers[peerlist[i]] = &peerStat{peerID: peerlist[i], peerScore: 0.5}
39+
}
40+
41+
// add peers to trackedPeers to make total number of peers > maxPeerTrackerSize
42+
peerlist = generateRandomPeerlist(t, 4)
3743
pid1 := peerlist[0]
3844
pid2 := peerlist[1]
3945
pid3 := peerlist[2]
@@ -54,13 +60,14 @@ func TestPeerTracker_GC(t *testing.T) {
5460
err = p.stop(ctx)
5561
require.NoError(t, err)
5662

57-
require.Nil(t, p.trackedPeers[pid1])
63+
// ensure amount of peers in trackedPeers is equal to minPeerTrackerSizeBeforeGC
64+
require.Len(t, p.trackedPeers, minPeerTrackerSizeBeforeGC)
5865
require.Nil(t, p.disconnectedPeers[pid3])
5966

6067
// ensure good peers were dumped to store
6168
peers, err := pidstore.Load(ctx)
6269
require.NoError(t, err)
63-
assert.Equal(t, 1, len(peers))
70+
require.Equal(t, minPeerTrackerSizeBeforeGC, len(peers))
6471
}
6572

6673
func TestPeerTracker_BlockPeer(t *testing.T) {

0 commit comments

Comments
 (0)