diff --git a/electrum/interface.py b/electrum/interface.py index 810727e7c..c1f34b4d8 100644 --- a/electrum/interface.py +++ b/electrum/interface.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 diff --git a/electrum/network.py b/electrum/network.py index d331011a5..08d467bc7 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -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