electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 064670bd75a67cb41ce42e03ea24f4583e9d1725
parent ff485cee62d33c5f6f95a425839026fa8872cd02
Author: SomberNight <somber.night@protonmail.com>
Date:   Thu,  4 Mar 2021 17:47:49 +0100

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

fixes #7083

Diffstat:
Melectrum/interface.py | 9+++++++--
Melectrum/network.py | 3++-
2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/electrum/interface.py b/electrum/interface.py @@ -686,12 +686,17 @@ class Interface(Logger): self.network.update_fee_estimates() 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. 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: - await self.session.close() + await self.session.close(force_after=force_after) # monitor_connection will cancel tasks async def run_fetch_blocks(self): diff --git a/electrum/network.py b/electrum/network.py @@ -1220,7 +1220,8 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): async def _stop(self, full_shutdown=False): self.logger.info("stopping network") 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: self.logger.info(f"exc during main_taskgroup cancellation: {repr(e)}") self.taskgroup = None