@@ -2,6 +2,7 @@ package p2p
2
2
3
3
import (
4
4
"context"
5
+ "sort"
5
6
"sync"
6
7
"time"
7
8
@@ -15,8 +16,10 @@ import (
15
16
const (
16
17
// defaultScore specifies the score for newly connected peers.
17
18
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.
19
20
maxPeerTrackerSize = 100
21
+ // minPeerTrackerSizeBeforeGC specifies the min amount of peers before the peerTracker starts removing peers.
22
+ minPeerTrackerSizeBeforeGC = 10
20
23
)
21
24
22
25
var (
@@ -240,31 +243,53 @@ func (p *peerTracker) gc() {
240
243
p .done <- struct {}{}
241
244
return
242
245
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
+ }
253
252
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 ()
262
256
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
266
288
}
289
+ delete (p .trackedPeers , peer .peerID )
290
+ deletedTrackedNum ++
267
291
}
292
+ p .metrics .peersTracked (- deletedTrackedNum )
268
293
}
269
294
270
295
// dumpPeers stores peers to the peerTracker's PeerIDStore if
0 commit comments