Skip to content

Commit e2197d9

Browse files
authored
fix(p2p/session): return peer to the queue in case of ErrNotFound (#159)
1 parent aecd7cf commit e2197d9

File tree

3 files changed

+16
-47
lines changed

3 files changed

+16
-47
lines changed

p2p/peer_tracker.go

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

33
import (
44
"context"
5-
"sort"
65
"sync"
76
"time"
87

@@ -18,8 +17,6 @@ const (
1817
defaultScore float32 = 1
1918
// maxPeerTrackerSize specifies the max amount of peers that can be added to the peerTracker.
2019
maxPeerTrackerSize = 100
21-
// minPeerTrackerSizeBeforeGC specifies the minimum amount of tracked peers before the peerTracker starts removing peers with lower peer scores.
22-
minPeerTrackerSizeBeforeGC = 10
2320
)
2421

2522
var (
@@ -244,7 +241,6 @@ func (p *peerTracker) gc() {
244241
return
245242
case <-ticker.C:
246243
p.cleanUpDisconnectedPeers()
247-
p.cleanUpTrackedPeers()
248244
p.dumpPeers(p.ctx)
249245
}
250246
}
@@ -265,33 +261,6 @@ func (p *peerTracker) cleanUpDisconnectedPeers() {
265261
p.metrics.peersDisconnected(-deletedDisconnectedNum)
266262
}
267263

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
288-
}
289-
delete(p.trackedPeers, peer.peerID)
290-
deletedTrackedNum++
291-
}
292-
p.metrics.peersTracked(-deletedTrackedNum)
293-
}
294-
295264
// dumpPeers stores peers to the peerTracker's PeerIDStore if
296265
// present.
297266
func (p *peerTracker) dumpPeers(ctx context.Context) {

p2p/peer_tracker_test.go

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

3434
maxAwaitingTime = time.Millisecond
3535

36-
peerlist := generateRandomPeerlist(t, minPeerTrackerSizeBeforeGC)
37-
for i := 0; i < minPeerTrackerSizeBeforeGC; i++ {
36+
peerlist := generateRandomPeerlist(t, 10)
37+
for i := 0; i < 10; i++ {
3838
p.trackedPeers[peerlist[i]] = &peerStat{peerID: peerlist[i], peerScore: 0.5}
3939
}
4040

41-
// add peers to trackedPeers to make total number of peers > maxPeerTrackerSize
4241
peerlist = generateRandomPeerlist(t, 4)
43-
pid1 := peerlist[0]
44-
pid2 := peerlist[1]
45-
pid3 := peerlist[2]
46-
pid4 := peerlist[3]
47-
48-
p.trackedPeers[pid1] = &peerStat{peerID: pid1, peerScore: 0.5}
49-
p.trackedPeers[pid2] = &peerStat{peerID: pid2, peerScore: 10}
50-
p.disconnectedPeers[pid3] = &peerStat{peerID: pid3, pruneDeadline: time.Now()}
51-
p.disconnectedPeers[pid4] = &peerStat{peerID: pid4, pruneDeadline: time.Now().Add(time.Minute * 10)}
42+
pid1 := peerlist[2]
43+
pid2 := peerlist[3]
44+
45+
p.disconnectedPeers[pid1] = &peerStat{peerID: pid1, pruneDeadline: time.Now()}
46+
p.disconnectedPeers[pid2] = &peerStat{peerID: pid2, pruneDeadline: time.Now().Add(time.Minute * 10)}
5247
assert.True(t, len(p.trackedPeers) > 0)
5348
assert.True(t, len(p.disconnectedPeers) > 0)
5449

@@ -60,14 +55,13 @@ func TestPeerTracker_GC(t *testing.T) {
6055
err = p.stop(ctx)
6156
require.NoError(t, err)
6257

63-
// ensure amount of peers in trackedPeers is equal to minPeerTrackerSizeBeforeGC
64-
require.Len(t, p.trackedPeers, minPeerTrackerSizeBeforeGC)
65-
require.Nil(t, p.disconnectedPeers[pid3])
58+
require.Len(t, p.trackedPeers, 10)
59+
require.Nil(t, p.disconnectedPeers[pid1])
6660

6761
// ensure good peers were dumped to store
6862
peers, err := pidstore.Load(ctx)
6963
require.NoError(t, err)
70-
require.Equal(t, minPeerTrackerSizeBeforeGC, len(peers))
64+
require.Equal(t, 10, len(peers))
7165
}
7266

7367
func TestPeerTracker_BlockPeer(t *testing.T) {

p2p/session.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@ func (s *session[H]) doRequest(
213213
"err", err,
214214
"peer", stat.peerID,
215215
)
216+
// ErrNotFound is not a critical error here. It means
217+
// that peer hasn't synced the requested range yet.
218+
// Returning peer to the queue, so it could serve another ranges.
219+
if errors.Is(err, header.ErrNotFound) {
220+
s.queue.push(stat)
221+
}
216222
return
217223
}
218224

0 commit comments

Comments
 (0)