@@ -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
145147func (p * peerTracker ) TrackPeer (nodeID ids.NodeID ) {
0 commit comments