1
0

network: close interfaces more aggressively (abort after 2 seconds)

fixes #7083
This commit is contained in:
SomberNight
2021-03-04 17:47:49 +01:00
parent ff485cee62
commit 064670bd75
2 changed files with 9 additions and 3 deletions

View File

@@ -686,12 +686,17 @@ class Interface(Logger):
self.network.update_fee_estimates() self.network.update_fee_estimates()
await asyncio.sleep(60) await asyncio.sleep(60)
async def close(self): async def close(self, *, force_after: int = None):
"""Closes the connection and waits for it to be closed. """Closes the connection and waits for it to be closed.
We try to flush buffered data to the wire, so this can take some time. We try to flush buffered data to the wire, so this can take some time.
""" """
if force_after is None:
# We give up after a while and just abort the connection.
# Note: specifically if the server is running Fulcrum, waiting seems hopeless,
# the connection must be aborted (see https://github.com/cculianu/Fulcrum/issues/76)
force_after = 2 # seconds
if self.session: if self.session:
await self.session.close() await self.session.close(force_after=force_after)
# monitor_connection will cancel tasks # monitor_connection will cancel tasks
async def run_fetch_blocks(self): async def run_fetch_blocks(self):

View File

@@ -1220,7 +1220,8 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
async def _stop(self, full_shutdown=False): async def _stop(self, full_shutdown=False):
self.logger.info("stopping network") self.logger.info("stopping network")
try: try:
await asyncio.wait_for(self.taskgroup.cancel_remaining(), timeout=2) # note: cancel_remaining ~cannot be cancelled, it suppresses CancelledError
await asyncio.wait_for(self.taskgroup.cancel_remaining(log=True), timeout=2)
except (asyncio.TimeoutError, asyncio.CancelledError) as e: except (asyncio.TimeoutError, asyncio.CancelledError) as e:
self.logger.info(f"exc during main_taskgroup cancellation: {repr(e)}") self.logger.info(f"exc during main_taskgroup cancellation: {repr(e)}")
self.taskgroup = None self.taskgroup = None