@@ -16,20 +16,22 @@ import (
1616)
1717
1818type peerTracker struct {
19- host host.Host
20- connGater * conngater.BasicConnectionGater
21- metrics * exchangeMetrics
2219 protocolID protocol.ID
23- peerLk sync.RWMutex
20+
21+ host host.Host
22+ connGater * conngater.BasicConnectionGater
23+
24+ peerLk sync.RWMutex
2425 // trackedPeers contains active peers that we can request to.
25- // we cache the peer once they disconnect,
2626 // so we can guarantee that peerQueue will only contain active peers
2727 trackedPeers map [libpeer.ID ]struct {}
2828
2929 // an optional interface used to periodically dump
3030 // good peers during garbage collection
3131 pidstore PeerIDStore
3232
33+ metrics * exchangeMetrics
34+
3335 ctx context.Context
3436 cancel context.CancelFunc
3537 // done is used to gracefully stop the peerTracker.
@@ -103,19 +105,20 @@ func (p *peerTracker) track() {
103105 p .done <- struct {}{}
104106 }()
105107
106- connSubs , err := p .host .EventBus ().Subscribe (& event.EvtPeerConnectednessChanged {})
108+ evtBus := p .host .EventBus ()
109+ connSubs , err := evtBus .Subscribe (& event.EvtPeerConnectednessChanged {})
107110 if err != nil {
108111 log .Errorw ("subscribing to EvtPeerConnectednessChanged" , "err" , err )
109112 return
110113 }
111114
112- identifySub , err := p . host . EventBus () .Subscribe (& event.EvtPeerIdentificationCompleted {})
115+ identifySub , err := evtBus .Subscribe (& event.EvtPeerIdentificationCompleted {})
113116 if err != nil {
114117 log .Errorw ("subscribing to EvtPeerIdentificationCompleted" , "err" , err )
115118 return
116119 }
117120
118- protocolSub , err := p . host . EventBus () .Subscribe (& event.EvtPeerProtocolsUpdated {})
121+ protocolSub , err := evtBus .Subscribe (& event.EvtPeerProtocolsUpdated {})
119122 if err != nil {
120123 log .Errorw ("subscribing to EvtPeerProtocolsUpdated" , "err" , err )
121124 return
@@ -124,9 +127,7 @@ func (p *peerTracker) track() {
124127 for {
125128 select {
126129 case <- p .ctx .Done ():
127- err = connSubs .Close ()
128- errors .Join (err , identifySub .Close (), protocolSub .Close ())
129- if err != nil {
130+ if err := closeSubscriptions (connSubs , identifySub , protocolSub ); err != nil {
130131 log .Errorw ("closing subscriptions" , "err" , err )
131132 }
132133 return
@@ -135,35 +136,23 @@ func (p *peerTracker) track() {
135136 if network .NotConnected == ev .Connectedness {
136137 p .disconnected (ev .Peer )
137138 }
138- case subscription := <- identifySub .Out ():
139- ev := subscription .(event.EvtPeerIdentificationCompleted )
140- p .connected (ev .Peer )
141- case subscription := <- protocolSub .Out ():
142- ev := subscription .(event.EvtPeerProtocolsUpdated )
139+ case identSubscription := <- identifySub .Out ():
140+ ev := identSubscription .(event.EvtPeerIdentificationCompleted )
141+ if slices .Contains (ev .Protocols , p .protocolID ) {
142+ p .connected (ev .Peer )
143+ }
144+ case protocolSubscription := <- protocolSub .Out ():
145+ ev := protocolSubscription .(event.EvtPeerProtocolsUpdated )
143146 if slices .Contains (ev .Removed , p .protocolID ) {
144147 p .disconnected (ev .Peer )
145- break
146148 }
147- p .connected (ev .Peer )
149+ if slices .Contains (ev .Added , p .protocolID ) {
150+ p .connected (ev .Peer )
151+ }
148152 }
149153 }
150154}
151155
152- // getPeers returns the tracker's currently tracked peers up to the `max`.
153- func (p * peerTracker ) getPeers (max int ) []libpeer.ID {
154- p .peerLk .RLock ()
155- defer p .peerLk .RUnlock ()
156-
157- peers := make ([]libpeer.ID , 0 , max )
158- for peer := range p .trackedPeers {
159- peers = append (peers , peer )
160- if len (peers ) == max {
161- break
162- }
163- }
164- return peers
165- }
166-
167156func (p * peerTracker ) connected (pID libpeer.ID ) {
168157 if err := pID .Validate (); err != nil {
169158 return
@@ -173,15 +162,6 @@ func (p *peerTracker) connected(pID libpeer.ID) {
173162 return
174163 }
175164
176- // check that peer supports our protocol id.
177- protocol , err := p .host .Peerstore ().SupportsProtocols (pID , p .protocolID )
178- if err != nil {
179- return
180- }
181- if ! slices .Contains (protocol , p .protocolID ) {
182- return
183- }
184-
185165 for _ , c := range p .host .Network ().ConnsToPeer (pID ) {
186166 // check if connection is short-termed and skip this peer
187167 if c .Stat ().Limited {
@@ -219,17 +199,21 @@ func (p *peerTracker) disconnected(pID libpeer.ID) {
219199 p .metrics .peersDisconnected (1 )
220200}
221201
222- func (p * peerTracker ) peers () []* peerStat {
202+ // peers returns the tracker's currently tracked peers up to the `max`.
203+ func (p * peerTracker ) peers (max int ) []* peerStat {
223204 p .peerLk .RLock ()
224205 defer p .peerLk .RUnlock ()
225206
226- peers := make ([]* peerStat , 0 )
207+ peers := make ([]* peerStat , 0 , max )
227208 for peerID := range p .trackedPeers {
228209 score := 0
229210 if info := p .host .ConnManager ().GetTagInfo (peerID ); info != nil {
230211 score = info .Tags [string (p .protocolID )]
231212 }
232213 peers = append (peers , & peerStat {peerID : peerID , peerScore : score })
214+ if len (peers ) == max {
215+ break
216+ }
233217 }
234218 return peers
235219}
@@ -300,3 +284,11 @@ func (p *peerTracker) updateScore(stats *peerStat, size uint64, duration time.Du
300284 score := stats .updateStats (size , duration )
301285 p .host .ConnManager ().TagPeer (stats .peerID , string (p .protocolID ), score )
302286}
287+
288+ func closeSubscriptions (subs ... event.Subscription ) error {
289+ var err error
290+ for _ , sub := range subs {
291+ err = errors .Join (err , sub .Close ())
292+ }
293+ return err
294+ }
0 commit comments