Skip to content

Commit 1dfa888

Browse files
bubble up error
1 parent 011e246 commit 1dfa888

File tree

3 files changed

+26
-18
lines changed

3 files changed

+26
-18
lines changed

network/network.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ func (n *network) SendAppRequestAny(ctx context.Context, minVersion *version.App
177177

178178
n.lock.Lock()
179179
defer n.lock.Unlock()
180-
if nodeID, ok := n.peers.GetAnyPeer(minVersion); ok {
180+
if nodeID, ok, err := n.peers.GetAnyPeer(minVersion); ok {
181+
if err != nil {
182+
return ids.EmptyNodeID, err
183+
}
181184
return nodeID, n.sendAppRequest(ctx, nodeID, request, handler)
182185
}
183186

network/peer_tracker.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,22 @@ func NewPeerTracker() *peerTracker {
6767

6868
// shouldTrackNewPeer returns true if we are not connected to enough peers.
6969
// otherwise returns true probabilistically based on the number of tracked peers.
70-
func (p *peerTracker) shouldTrackNewPeer() bool {
70+
func (p *peerTracker) shouldTrackNewPeer() (bool, error) {
7171
numResponsivePeers := p.responsivePeers.Len()
7272
if numResponsivePeers < desiredMinResponsivePeers {
73-
return true
73+
return true, nil
7474
}
7575
if len(p.trackedPeers) >= len(p.peers) {
7676
// already tracking all the peers
77-
return false
77+
return false, nil
7878
}
7979
newPeerProbability := math.Exp(-float64(numResponsivePeers) * newPeerConnectFactor)
8080
randomValue, err := rand.SecureFloat64()
8181
if err != nil {
82-
log.Error("failed to generate secure random number for peer tracking", "err", err)
8382
// Fallback to conservative behavior - don't track new peer
84-
return false
83+
return false, err
8584
}
86-
return randomValue < newPeerProbability
85+
return randomValue < newPeerProbability, nil
8786
}
8887

8988
// getResponsivePeer returns a random [ids.NodeID] of a peer that has responded
@@ -101,8 +100,12 @@ func (p *peerTracker) getResponsivePeer() (ids.NodeID, safemath.Averager, bool)
101100
return nodeID, peer.bandwidth, true
102101
}
103102

104-
func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, bool) {
105-
if p.shouldTrackNewPeer() {
103+
func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, bool, error) {
104+
shouldTrackNewPeer, err := p.shouldTrackNewPeer()
105+
if err != nil {
106+
return ids.NodeID{}, false, err
107+
}
108+
if shouldTrackNewPeer {
106109
for nodeID := range p.peers {
107110
// if minVersion is specified and peer's version is less, skip
108111
if minVersion != nil && p.peers[nodeID].version.Compare(minVersion) < 0 {
@@ -113,7 +116,7 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
113116
continue
114117
}
115118
log.Debug("peer tracking: connecting to new peer", "trackedPeers", len(p.trackedPeers), "nodeID", nodeID)
116-
return nodeID, true
119+
return nodeID, true, nil
117120
}
118121
}
119122
var (
@@ -125,9 +128,7 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
125128
randomValue, err := rand.SecureFloat64()
126129
switch {
127130
case err != nil:
128-
log.Error("failed to generate secure random number for peer selection", "err", err)
129-
// Fallback to deterministic behavior - use bandwidth heap
130-
nodeID, averager, ok = p.bandwidthHeap.Pop()
131+
return ids.NodeID{}, false, err
131132
case randomValue < randomPeerProbability:
132133
random = true
133134
nodeID, averager, ok = p.getResponsivePeer()
@@ -136,10 +137,11 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
136137
}
137138
if ok {
138139
log.Debug("peer tracking: popping peer", "nodeID", nodeID, "bandwidth", averager.Read(), "random", random)
139-
return nodeID, true
140+
return nodeID, true, err
140141
}
141142
// if no nodes found in the bandwidth heap, return a tracked node at random
142-
return p.trackedPeers.Peek()
143+
nodeID, ok = p.trackedPeers.Peek()
144+
return nodeID, ok, nil
143145
}
144146

145147
func (p *peerTracker) TrackPeer(nodeID ids.NodeID) {

network/peer_tracker_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ func TestPeerTracker(t *testing.T) {
2828

2929
// Expect requests to go to new peers until we have desiredMinResponsivePeers responsive peers.
3030
for i := 0; i < desiredMinResponsivePeers+numExtraPeers/2; i++ {
31-
peer, ok := p.GetAnyPeer(nil)
31+
peer, ok, err := p.GetAnyPeer(nil)
32+
require.NoError(err)
3233
require.True(ok)
3334
require.NotNil(peer)
3435

@@ -54,7 +55,8 @@ func TestPeerTracker(t *testing.T) {
5455
// Expect requests to go to responsive or new peers, so long as they are available
5556
numRequests := 50
5657
for i := 0; i < numRequests; i++ {
57-
peer, ok := p.GetAnyPeer(nil)
58+
peer, ok, err := p.GetAnyPeer(nil)
59+
require.NoError(err)
5860
require.True(ok)
5961
require.NotNil(peer)
6062

@@ -78,7 +80,8 @@ func TestPeerTracker(t *testing.T) {
7880
}
7981

8082
// Requests should fall back on non-responsive peers when no other choice is left
81-
peer, ok := p.GetAnyPeer(nil)
83+
peer, ok, err := p.GetAnyPeer(nil)
84+
require.NoError(err)
8285
require.True(ok)
8386
require.NotNil(peer)
8487

0 commit comments

Comments
 (0)