Remove RequestError; clean up a bit
This commit is contained in:
parent
e1309836ca
commit
918592fbff
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user