From dc0d83b31bf85d9047b8c2e8df33765ae88edc0d Mon Sep 17 00:00:00 2001 From: Piper Merriam Date: Wed, 20 Jun 2018 12:09:40 -0600 Subject: [PATCH] cleanup --- p2p/peer.py | 6 ++++-- p2p/server.py | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/p2p/peer.py b/p2p/peer.py index 6e85157c6e..fe5e22073f 100644 --- a/p2p/peer.py +++ b/p2p/peer.py @@ -601,11 +601,13 @@ def is_full(self) -> bool: def is_valid_connection_candidate(self, candidate: Node) -> bool: # connect to no more then 2 nodes with the same IP nodes_by_ip = groupby( - operator.attrgetter('remote.address.ip'), self.connected_nodes.values()) + operator.attrgetter('remote.address.ip'), + self.connected_nodes.values(), + ) matching_ip_nodes = nodes_by_ip.get(candidate.address.ip, []) return len(matching_ip_nodes) <= 2 - def get_nodes_to_connect(self) -> Generator[Node, None, None]: + def get_nodes_to_connect(self) -> Iterator[Node]: for node in self.discovery.get_random_nodes(self.max_peers): if self.is_valid_connection_candidate(node): yield node diff --git a/p2p/server.py b/p2p/server.py index 1ca1753c34..5444a38b88 100644 --- a/p2p/server.py +++ b/p2p/server.py @@ -58,6 +58,9 @@ from trinity.db.header import BaseAsyncHeaderDB # noqa: F401 +DIAL_IN_OUT_RATIO = 0.75 + + class Server(BaseService): """Server listening for incoming connections""" logger = logging.getLogger("p2p.server.Server") @@ -256,19 +259,23 @@ async def _receive_handshake( if self.peer_pool.is_full: peer.disconnect(DisconnectReason.too_many_peers) + elif not self.peer_pool.is_valid_connection_candidate(peer.remote): + peer.disconnect(DisconnectReason.too_many_peers) + + total_peers = len(self.peer_pool.connected_nodes) + inbound_peer_count = len([ + peer + for peer + in self.peer_pool.connected_nodes.values() + if peer.inbound + ]) + if total_peers > 1 and inbound_peer_count / total_peers > DIAL_IN_OUT_RATIO: + # make sure to have at least 1/4 outbound connections + peer.disconnect(DisconnectReason.useless_peer) else: - total_peers = len(self.peer_pool.connected_nodes) - inbound_peers = len( - [peer for peer in self.peer_pool.connected_nodes.values() if peer.inbound]) - if total_peers > 1 and inbound_peers / total_peers > 0.75: - # make sure to have at least 1/4 outbound connections - peer.disconnect(DisconnectReason.useless_peer) - elif not self.peer_pool.is_valid_connection_candidate(peer.remote): - peer.disconnect(DisconnectReason.useless_peer) - else: - # We use self.wait() here as a workaround for - # https://github.com/ethereum/py-evm/issues/670. - await self.wait(self.do_handshake(peer)) + # We use self.wait() here as a workaround for + # https://github.com/ethereum/py-evm/issues/670. + await self.wait(self.do_handshake(peer)) async def do_handshake(self, peer: BasePeer) -> None: await peer.do_p2p_handshake(),