interface.got_disconnected: change from Future to Event
Events are far easier to reason about.
This commit is contained in:
@@ -351,7 +351,7 @@ class Interface(Logger):
|
|||||||
|
|
||||||
def __init__(self, *, network: 'Network', server: ServerAddr, proxy: Optional[dict]):
|
def __init__(self, *, network: 'Network', server: ServerAddr, proxy: Optional[dict]):
|
||||||
self.ready = asyncio.Future()
|
self.ready = asyncio.Future()
|
||||||
self.got_disconnected = asyncio.Future()
|
self.got_disconnected = asyncio.Event()
|
||||||
self.server = server
|
self.server = server
|
||||||
Logger.__init__(self)
|
Logger.__init__(self)
|
||||||
assert network.config.path
|
assert network.config.path
|
||||||
@@ -486,8 +486,7 @@ class Interface(Logger):
|
|||||||
self.logger.debug(f"(disconnect) trace for {repr(e)}", exc_info=True)
|
self.logger.debug(f"(disconnect) trace for {repr(e)}", exc_info=True)
|
||||||
finally:
|
finally:
|
||||||
await self.network.connection_down(self)
|
await self.network.connection_down(self)
|
||||||
if not self.got_disconnected.done():
|
self.got_disconnected.set()
|
||||||
self.got_disconnected.set_result(1)
|
|
||||||
# if was not 'ready' yet, schedule waiting coroutines:
|
# if was not 'ready' yet, schedule waiting coroutines:
|
||||||
self.ready.cancel()
|
self.ready.cancel()
|
||||||
return wrapper_func
|
return wrapper_func
|
||||||
|
|||||||
@@ -820,20 +820,20 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
|
|||||||
assert iface.ready.done(), "interface not ready yet"
|
assert iface.ready.done(), "interface not ready yet"
|
||||||
# try actual request
|
# try actual request
|
||||||
success_fut = asyncio.ensure_future(func(self, *args, **kwargs))
|
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.done() and not success_fut.cancelled():
|
||||||
if success_fut.exception():
|
if success_fut.exception():
|
||||||
try:
|
try:
|
||||||
raise success_fut.exception()
|
raise success_fut.exception()
|
||||||
except RequestTimedOut:
|
except RequestTimedOut:
|
||||||
await iface.close()
|
await iface.close()
|
||||||
await iface.got_disconnected
|
await iface.got_disconnected.wait()
|
||||||
continue # try again
|
continue # try again
|
||||||
except RequestCorrupted as e:
|
except RequestCorrupted as e:
|
||||||
# TODO ban server?
|
# TODO ban server?
|
||||||
iface.logger.exception(f"RequestCorrupted: {e}")
|
iface.logger.exception(f"RequestCorrupted: {e}")
|
||||||
await iface.close()
|
await iface.close()
|
||||||
await iface.got_disconnected
|
await iface.got_disconnected.wait()
|
||||||
continue # try again
|
continue # try again
|
||||||
return success_fut.result()
|
return success_fut.result()
|
||||||
# otherwise; try again
|
# otherwise; try again
|
||||||
|
|||||||
Reference in New Issue
Block a user