network: close interfaces more aggressively (abort after 2 seconds)
fixes #7083
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user