Remove RequestError; clean up a bit

This commit is contained in:
Neil Booth 2018-07-25 09:42:40 +08:00
parent e1309836ca
commit 918592fbff

View File

@ -25,10 +25,6 @@ STALE_SECS = 24 * 3600
WAKEUP_SECS = 300 WAKEUP_SECS = 300
class RequestError(Exception):
pass
class BadPeerError(Exception): class BadPeerError(Exception):
pass pass
@ -36,7 +32,7 @@ class BadPeerError(Exception):
def assert_good(request, instance): def assert_good(request, instance):
result = request.result() result = request.result()
if not isinstance(result, instance): if not isinstance(result, instance):
raise RequestError(f'{request} returned bad result type ' raise BadPeerError(f'{request} returned bad result type '
f'{type(result).__name__}') f'{type(result).__name__}')
@ -232,24 +228,31 @@ class PeerManager(object):
async with PeerSession(peer.host, port, **kwargs) as session: async with PeerSession(peer.host, port, **kwargs) as session:
await self._verify_peer(session, peer) await self._verify_peer(session, peer)
success = True success = True
except RPCError as e: break
self.logger.error(f'[{peer}] RPC error: {e.message} '
f'({e.code})')
except (RequestError, asyncio.TimeoutError) as e:
self.logger.error(f'[{peer}] {e}')
except BadPeerError as e: except BadPeerError as e:
self.logger.error(f'[{peer}] marking bad: ({e})') self.logger.error(f'[{peer}] marking bad: ({e})')
peer.mark_bad() peer.mark_bad()
break
except RPCError as e:
self.logger.error(f'[{peer}] RPC error: {e.message} '
f'({e.code})')
except asyncio.TimeoutError as e:
self.logger.error(f'[{peer}] {e}')
except (OSError, ConnectionError) as e: except (OSError, ConnectionError) as e:
self.logger.info(f'[{peer}] {kind} connection to ' self.logger.info(f'[{peer}] {kind} connection to '
f'port {port} failed: {e}') f'port {port} failed: {e}')
continue
self._set_verification_status(peer, kind, success) self._set_verification_status(peer, kind, success)
if success: # Forget the peer if appropriate, e.g. long-term unreachable
return if not success:
if peer.last_good and not peer.bad:
self._maybe_forget_peer(peer) try_limit = 10
else:
try_limit = 3
if peer.try_count >= try_limit:
desc = 'bad' if peer.bad else 'unreachable'
self.logger.info(f'forgetting {desc} peer: {peer}')
self.peers.discard(peer)
async def _verify_peer(self, session, peer): async def _verify_peer(self, session, peer):
if not peer.is_tor: if not peer.is_tor:
@ -267,7 +270,7 @@ class PeerManager(object):
# Protocol version 1.1 returns a pair with the version first # Protocol version 1.1 returns a pair with the version first
if len(result) != 2 or not all(isinstance(x, str) for x in result): if len(result) != 2 or not all(isinstance(x, str) for x in result):
raise RequestFailure(f'bad server.version result: {result}') raise BadPeerError(f'bad server.version result: {result}')
server_version, protocol_version = result server_version, protocol_version = result
peer.server_version = server_version peer.server_version = server_version
peer.features['server_version'] = server_version peer.features['server_version'] = server_version
@ -383,21 +386,6 @@ class PeerManager(object):
self.peers.remove(match) self.peers.remove(match)
elif peer.host in match.features['hosts']: elif peer.host in match.features['hosts']:
match.update_features_from_peer(peer) match.update_features_from_peer(peer)
else:
self._maybe_forget_peer(peer)
def _maybe_forget_peer(self, peer):
'''Forget the peer if appropriate, e.g. long-term unreachable.'''
if peer.last_good and not peer.bad:
try_limit = 10
else:
try_limit = 3
forget = peer.try_count >= try_limit
if forget:
desc = 'bad' if peer.bad else 'unreachable'
self.logger.info(f'forgetting {desc} peer: {peer}')
self.peers.discard(peer)
# #
# External interface # External interface