Browse Source
interface.got_disconnected: change from Future to Event
Events are far easier to reason about.
patch-4
SomberNight
4 years ago
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
2 changed files with
5 additions and
6 deletions
-
electrum/interface.py
-
electrum/network.py
|
|
@ -351,7 +351,7 @@ class Interface(Logger): |
|
|
|
|
|
|
|
def __init__(self, *, network: 'Network', server: ServerAddr, proxy: Optional[dict]): |
|
|
|
self.ready = asyncio.Future() |
|
|
|
self.got_disconnected = asyncio.Future() |
|
|
|
self.got_disconnected = asyncio.Event() |
|
|
|
self.server = server |
|
|
|
Logger.__init__(self) |
|
|
|
assert network.config.path |
|
|
@ -486,8 +486,7 @@ class Interface(Logger): |
|
|
|
self.logger.debug(f"(disconnect) trace for {repr(e)}", exc_info=True) |
|
|
|
finally: |
|
|
|
await self.network.connection_down(self) |
|
|
|
if not self.got_disconnected.done(): |
|
|
|
self.got_disconnected.set_result(1) |
|
|
|
self.got_disconnected.set() |
|
|
|
# if was not 'ready' yet, schedule waiting coroutines: |
|
|
|
self.ready.cancel() |
|
|
|
return wrapper_func |
|
|
|
|
|
@ -820,20 +820,20 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): |
|
|
|
assert iface.ready.done(), "interface not ready yet" |
|
|
|
# try actual request |
|
|
|
success_fut = asyncio.ensure_future(func(self, *args, **kwargs)) |
|
|
|
await asyncio.wait([success_fut, iface.got_disconnected], return_when=asyncio.FIRST_COMPLETED) |
|
|
|
await asyncio.wait([success_fut, iface.got_disconnected.wait()], return_when=asyncio.FIRST_COMPLETED) |
|
|
|
if success_fut.done() and not success_fut.cancelled(): |
|
|
|
if success_fut.exception(): |
|
|
|
try: |
|
|
|
raise success_fut.exception() |
|
|
|
except RequestTimedOut: |
|
|
|
await iface.close() |
|
|
|
await iface.got_disconnected |
|
|
|
await iface.got_disconnected.wait() |
|
|
|
continue # try again |
|
|
|
except RequestCorrupted as e: |
|
|
|
# TODO ban server? |
|
|
|
iface.logger.exception(f"RequestCorrupted: {e}") |
|
|
|
await iface.close() |
|
|
|
await iface.got_disconnected |
|
|
|
await iface.got_disconnected.wait() |
|
|
|
continue # try again |
|
|
|
return success_fut.result() |
|
|
|
# otherwise; try again |
|
|
|