@@ -277,7 +277,10 @@ func (c *conn) set(f connFlag, val bool) {
277277 atomic .StoreInt32 ((* int32 )(& c .flags ), int32 (flags ))
278278}
279279
280- // Peers returns all connected peers.
280+ // Peers returns the public view of connected remote nodes.
281+ //
282+ // The returned slice contains one entry per remote NodeID, so multiple physical
283+ // connections associated with the same node are represented by a single entry.
281284func (srv * Server ) Peers () []* Peer {
282285 var ps []* Peer
283286 select {
@@ -295,7 +298,11 @@ func (srv *Server) Peers() []*Peer {
295298 return ps
296299}
297300
298- // PeerCount returns the number of connected peers.
301+ // PeerCount returns the number of connected remote nodes.
302+ //
303+ // Multiple physical connections associated with the same remote NodeID
304+ // (for example pair peers) are counted once because the public peer view is
305+ // keyed by NodeID.
299306func (srv * Server ) PeerCount () int {
300307 var count int
301308 select {
@@ -582,6 +589,7 @@ func (srv *Server) run(dialstate dialer) {
582589 defer srv .loopWG .Done ()
583590 var (
584591 peers = make (map [discover.NodeID ]* Peer )
592+ connCount = 0
585593 inboundCount = 0
586594 trusted = make (map [discover.NodeID ]bool , len (srv .TrustedNodes ))
587595 taskdone = make (chan task , maxActiveDialTasks )
@@ -702,14 +710,15 @@ running:
702710 p .events = & srv .peerFeed
703711 }
704712 name := truncateName (c .name )
713+ connCount ++
705714
706715 go srv .runPeer (p )
707716 if peers [c .id ] != nil {
708717 peers [c .id ].PairPeer = p
709- srv .log .Debug ("Adding p2p pair peer" , "name" , name , "addr" , c .fd .RemoteAddr (), "peers " , len ( peers ) + 1 )
718+ srv .log .Debug ("Adding p2p pair peer" , "name" , name , "addr" , c .fd .RemoteAddr (), "connections " , connCount )
710719 } else {
711720 peers [c .id ] = p
712- srv .log .Debug ("Adding p2p peer" , "name" , name , "addr" , c .fd .RemoteAddr (), "peers " , len ( peers ) + 1 )
721+ srv .log .Debug ("Adding p2p peer" , "name" , name , "addr" , c .fd .RemoteAddr (), "connections " , connCount )
713722 }
714723 if p .Inbound () {
715724 inboundCount ++
@@ -730,8 +739,8 @@ running:
730739 case pd := <- srv .delpeer :
731740 // A peer disconnected.
732741 d := common .PrettyDuration (mclock .Now () - pd .created )
733- pd . log . Debug ( "Removing p2p peer" , "duration" , d , "peers" , len (peers ) - 1 , "req" , pd . requested , "err" , pd . err )
734- delete ( peers , pd .ID () )
742+ connCount = removePeerTracking (peers , pd , connCount )
743+ pd . log . Debug ( "Removing p2p peer" , "duration" , d , "connections" , connCount , "req" , pd .requested , "err" , pd . err )
735744 if pd .Inbound () {
736745 inboundCount --
737746 }
@@ -755,11 +764,23 @@ running:
755764 // Wait for peers to shut down. Pending connections and tasks are
756765 // not handled here and will terminate soon-ish because srv.quit
757766 // is closed.
758- for len (peers ) > 0 {
759- p := <- srv .delpeer
760- p .log .Trace ("<-delpeer (spindown)" , "remainingTasks" , len (runningTasks ))
761- delete (peers , p .ID ())
767+ for connCount > 0 {
768+ pd := <- srv .delpeer
769+ pd .log .Trace ("<-delpeer (spindown)" , "remainingTasks" , len (runningTasks ))
770+ connCount = removePeerTracking (peers , pd , connCount )
771+ }
772+ }
773+
774+ func removePeerTracking (peers map [discover.NodeID ]* Peer , pd peerDrop , connCount int ) int {
775+ if connCount > 0 {
776+ connCount --
777+ }
778+ if current := peers [pd .ID ()]; current == pd .Peer {
779+ delete (peers , pd .ID ())
780+ } else if current != nil && current .PairPeer == pd .Peer {
781+ current .PairPeer = nil
762782 }
783+ return connCount
763784}
764785
765786func (srv * Server ) protoHandshakeChecks (peers map [discover.NodeID ]* Peer , inboundCount int , c * conn ) error {
0 commit comments