Skip to content

Commit 4f48548

Browse files
committed
fix(p2p/session): return err if peer tracker is empty
1 parent 2511ced commit 4f48548

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

p2p/exchange.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,13 @@ func (ex *Exchange[H]) GetRangeByHeight(
292292
attribute.Int64("to", int64(to)),
293293
))
294294
defer span.End()
295-
session := newSession[H](
295+
session, err := newSession[H](
296296
ex.ctx, ex.host, ex.peerTracker, ex.protocolID, ex.Params.RangeRequestTimeout, ex.metrics, withValidation(from),
297297
)
298+
// TODO(@vgonkivs): decide what to do with this error. Maybe we should fall into "discovery mode" and try to collect peers???
299+
if err != nil {
300+
return nil, err
301+
}
298302
defer session.close()
299303
// we request the next header height that we don't have: `fromHead`+1
300304
amount := to - (from.Height() + 1)

p2p/session.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,28 @@ func newSession[H header.Header[H]](
6262
requestTimeout time.Duration,
6363
metrics *exchangeMetrics,
6464
options ...option[H],
65-
) *session[H] {
65+
) (*session[H], error) {
6666
ctx, cancel := context.WithCancel(ctx)
6767
ses := &session[H]{
6868
ctx: ctx,
6969
cancel: cancel,
7070
protocolID: protocolID,
7171
host: h,
72-
queue: newPeerQueue(ctx, peerTracker.peers()),
7372
peerTracker: peerTracker,
7473
requestTimeout: requestTimeout,
7574
metrics: metrics,
7675
}
7776

77+
peers := peerTracker.peers()
78+
if len(peers) == 0 {
79+
return nil, errors.New("empty peer tracker")
80+
}
81+
ses.queue = newPeerQueue(ctx, peers)
82+
7883
for _, opt := range options {
7984
opt(ses)
8085
}
81-
return ses
86+
return ses, nil
8287
}
8388

8489
// getRangeByHeight requests headers from different peers.

p2p/session_test.go

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"time"
77

88
"github.com/libp2p/go-libp2p/core/peer"
9+
blankhost "github.com/libp2p/go-libp2p/p2p/host/blank"
10+
swarm "github.com/libp2p/go-libp2p/p2p/net/swarm/testing"
911
"github.com/stretchr/testify/assert"
1012
"github.com/stretchr/testify/require"
1113

@@ -25,34 +27,44 @@ func Test_PrepareRequests(t *testing.T) {
2527
func Test_Validate(t *testing.T) {
2628
suite := headertest.NewTestSuite(t)
2729
head := suite.Head()
28-
ses := newSession(
30+
peerId := peer.ID("test")
31+
pT := &peerTracker{trackedPeers: make(map[peer.ID]struct{})}
32+
pT.trackedPeers[peerId] = struct{}{}
33+
pT.host = blankhost.NewBlankHost(swarm.GenSwarm(t))
34+
ses, err := newSession(
2935
context.Background(),
3036
nil,
31-
&peerTracker{trackedPeers: make(map[peer.ID]struct{})},
37+
pT,
3238
"", time.Second, nil,
3339
withValidation(head),
3440
)
3541

42+
require.NoError(t, err)
3643
headers := suite.GenDummyHeaders(5)
37-
err := ses.verify(headers)
44+
err = ses.verify(headers)
3845
assert.NoError(t, err)
3946
}
4047

4148
// Test_ValidateFails ensures that non-adjacent range will return an error.
4249
func Test_ValidateFails(t *testing.T) {
4350
suite := headertest.NewTestSuite(t)
4451
head := suite.Head()
45-
ses := newSession(
52+
53+
peerId := peer.ID("test")
54+
pT := &peerTracker{trackedPeers: make(map[peer.ID]struct{})}
55+
pT.trackedPeers[peerId] = struct{}{}
56+
pT.host = blankhost.NewBlankHost(swarm.GenSwarm(t))
57+
ses, err := newSession(
4658
context.Background(),
47-
nil,
48-
&peerTracker{trackedPeers: make(map[peer.ID]struct{})},
59+
blankhost.NewBlankHost(swarm.GenSwarm(t)),
60+
pT,
4961
"", time.Second, nil,
5062
withValidation(head),
5163
)
52-
64+
require.NoError(t, err)
5365
headers := suite.GenDummyHeaders(5)
5466
// break adjacency
5567
headers[2] = headers[4]
56-
err := ses.verify(headers)
68+
err = ses.verify(headers)
5769
assert.Error(t, err)
5870
}

0 commit comments

Comments
 (0)