Skip to content

Commit 3787881

Browse files
committed
Merge remote-tracking branch 'grin_ardocrat/peers_fix' into grim
2 parents 464babc + 9585c02 commit 3787881

6 files changed

Lines changed: 153 additions & 131 deletions

File tree

p2p/src/peers.rs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

p2p/src/serv.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ impl Server {
187187
&self.handshake,
188188
self.peers.clone(),
189189
)?;
190+
if self.peers.enough_outbound_peers() {
191+
peer.stop();
192+
}
190193
let peer = Arc::new(peer);
191194
self.peers.add_connected(peer.clone())?;
192195
Ok(peer)

p2p/src/store.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ const STORE_SUBPATH: &str = "peers";
2727

2828
const PEER_PREFIX: u8 = b'P';
2929

30-
// Types of messages
30+
// Types of peers
3131
enum_from_primitive! {
3232
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
3333
pub enum State {
3434
Healthy = 0,
3535
Banned = 1,
3636
Defunct = 2,
37+
Unknown = 3,
3738
}
3839
}
3940

p2p/src/types.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,13 @@ impl<'de> Visitor<'de> for PeerAddrs {
183183
Ok(ip) => peers.push(PeerAddr(ip)),
184184
// If that fails it's probably a DNS record
185185
Err(_) => {
186-
let socket_addrs = entry.to_socket_addrs().map_err(|_| {
187-
serde::de::Error::custom(format!("Unable to resolve DNS: {}", entry))
188-
})?;
189-
peers.append(&mut socket_addrs.map(PeerAddr).collect());
186+
let socket_addrs: Result<std::vec::IntoIter<SocketAddr>, M::Error> =
187+
entry.to_socket_addrs().map_err(|_| {
188+
serde::de::Error::custom(format!("Unable to resolve DNS: {}", entry))
189+
});
190+
if let Ok(socket_addrs) = socket_addrs {
191+
peers.append(&mut socket_addrs.map(PeerAddr).collect());
192+
}
190193
}
191194
}
192195
}

0 commit comments

Comments
 (0)