@@ -230,17 +230,34 @@ func (s *Syncer) handleRPC(id types.Specifier, stream *gateway.Stream, origin *P
230230
231231 switch r := gateway .ObjectForID (id ).(type ) {
232232 case * gateway.RPCShareNodes :
233- peers , err := s .pm .Peers ()
234- if err != nil {
235- return fmt .Errorf ("failed to fetch peers: %w" , err )
236- } else if n := len (peers ); n > 10 {
237- frand .Shuffle (n , func (i , j int ) {
238- peers [i ], peers [j ] = peers [j ], peers [i ]
239- })
240- peers = peers [:10 ]
233+ seen := make (map [string ]struct {})
234+ // check connected peers first
235+ connected := s .Peers ()
236+ frand .Shuffle (len (connected ), func (i , j int ) { connected [i ], connected [j ] = connected [j ], connected [i ] })
237+ for i := 0 ; i < len (connected ) && len (r .Peers ) < 10 ; i ++ {
238+ p := connected [i ]
239+ if _ , ok := seen [p .Addr ()]; ok || p .Inbound {
240+ continue
241+ }
242+ r .Peers = append (r .Peers , p .Addr ())
243+ seen [p .Addr ()] = struct {}{}
241244 }
242- for _ , p := range peers {
243- r .Peers = append (r .Peers , p .Address )
245+
246+ if len (r .Peers ) < 10 {
247+ // fill the rest with random known peers
248+ morePeers , err := s .pm .Peers ()
249+ if err != nil {
250+ return fmt .Errorf ("failed to fetch peers: %w" , err )
251+ }
252+ frand .Shuffle (len (morePeers ), func (i , j int ) { morePeers [i ], morePeers [j ] = morePeers [j ], morePeers [i ] })
253+ for i := 0 ; i < len (morePeers ) && len (r .Peers ) < 10 ; i ++ {
254+ p := morePeers [i ]
255+ if _ , ok := seen [p .Address ]; ok {
256+ continue
257+ }
258+ r .Peers = append (r .Peers , p .Address )
259+ seen [p .Address ] = struct {}{}
260+ }
244261 }
245262 if err := stream .WriteResponse (r ); err != nil {
246263 return err
0 commit comments