@@ -61,6 +61,7 @@ impl Peers {
6161 /// Adds the peer to our internal peer mapping. Note that the peer is still
6262 /// returned so the server can run it.
6363 pub fn add_connected ( & self , peer : Arc < Peer > ) -> Result < ( ) , Error > {
64+ let enough_outbound = self . enough_outbound_peers ( ) ;
6465 let peer_data: PeerData ;
6566 {
6667 // Scope for peers vector lock - dont hold the peers lock while adding to lmdb
@@ -77,8 +78,10 @@ impl Peers {
7778 ban_reason : ReasonForBan :: None ,
7879 last_connected : Utc :: now ( ) . timestamp ( ) ,
7980 } ;
80- debug ! ( "Adding newly connected peer {}." , peer_data. addr) ;
81- peers. insert ( peer_data. addr , peer) ;
81+ if !enough_outbound || !peer. info . is_outbound ( ) {
82+ debug ! ( "Adding newly connected peer {}." , peer_data. addr) ;
83+ peers. insert ( peer_data. addr , peer) ;
84+ }
8285 }
8386 debug ! ( "Saving newly connected peer {}." , peer_data. addr) ;
8487 if let Err ( e) = self . save_peer ( & peer_data) {
@@ -142,6 +145,7 @@ impl Peers {
142145 }
143146 false
144147 }
148+
145149 /// Ban a peer, disconnecting it if we're currently connected
146150 pub fn ban_peer ( & self , peer_addr : PeerAddr , ban_reason : ReasonForBan ) -> Result < ( ) , Error > {
147151 // Update the peer in peers db
@@ -261,6 +265,8 @@ impl Peers {
261265 break ;
262266 }
263267 } ;
268+ // Mark peer as defunct after ping failure.
269+ let _ = self . update_state ( p. info . addr , State :: Defunct ) ;
264270 p. stop ( ) ;
265271 peers. remove ( & p. info . addr ) ;
266272 }
@@ -747,21 +753,24 @@ impl NetAdapter for Peers {
747753 trace ! ( "Received {} peer addrs, saving." , peer_addrs. len( ) ) ;
748754 let mut to_save: Vec < PeerData > = Vec :: new ( ) ;
749755 for pa in peer_addrs {
750- if let Ok ( e ) = self . exists_peer ( pa) {
751- if e {
756+ if let Ok ( mut p ) = self . get_peer ( pa) {
757+ if p . flags != State :: Defunct {
752758 continue ;
753759 }
760+ p. flags = State :: Unknown ;
761+ to_save. push ( p) ;
762+ } else {
763+ let peer = PeerData {
764+ addr : pa,
765+ capabilities : Capabilities :: UNKNOWN ,
766+ user_agent : "" . to_string ( ) ,
767+ flags : State :: Unknown ,
768+ last_banned : 0 ,
769+ ban_reason : ReasonForBan :: None ,
770+ last_connected : 0 ,
771+ } ;
772+ to_save. push ( peer) ;
754773 }
755- let peer = PeerData {
756- addr : pa,
757- capabilities : Capabilities :: UNKNOWN ,
758- user_agent : "" . to_string ( ) ,
759- flags : State :: Healthy ,
760- last_banned : 0 ,
761- ban_reason : ReasonForBan :: None ,
762- last_connected : Utc :: now ( ) . timestamp ( ) ,
763- } ;
764- to_save. push ( peer) ;
765774 }
766775 if let Err ( e) = self . save_peers ( to_save) {
767776 error ! ( "Could not save received peer addresses: {:?}" , e) ;
0 commit comments