tsynchronizer/verifier: ensure fairness between wallets (follow-up) - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit bf7129d57e26709288e052c7649e96e8534b806d DIR parent e0cfb2179d108e79303223684646bc1d905f5a37 HTML Author: SomberNight <somber.night@protonmail.com> Date: Mon, 1 Mar 2021 13:08:01 +0100 synchronizer/verifier: ensure fairness between wallets (follow-up) follow-up to https://github.com/spesmilo/electrum/commit/4346d2fc765f40a9388108c06cf1ee132d663923 It's not just about the Synchronizer, the Verifier should not starve other jobs either... (previously I thought the Verifier is not too important as it only makes requests if there are new txs; however with LNWatcher its progress is not persisted) Diffstat: M electrum/lnverifier.py | 8 +++++--- M electrum/synchronizer.py | 3 --- M electrum/util.py | 4 ++++ M electrum/verifier.py | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) --- DIR diff --git a/electrum/lnverifier.py b/electrum/lnverifier.py t@@ -110,8 +110,9 @@ class LNChannelVerifier(NetworkJobOnDefaultServer): # we are verifying channel announcements as they are from untrusted ln peers. # we use electrum servers to do this. however we don't trust electrum servers either... try: - result = await self.network.get_txid_from_txpos( - block_height, short_channel_id.txpos, True) + async with self._network_request_semaphore: + result = await self.network.get_txid_from_txpos( + block_height, short_channel_id.txpos, True) except aiorpcx.jsonrpc.RPCError: # the electrum server is complaining about the txpos for given block. # it is not clear what to do now, but let's believe the server. t@@ -128,7 +129,8 @@ class LNChannelVerifier(NetworkJobOnDefaultServer): # the electrum server sent an incorrect proof. blame is on server, not the ln peer raise GracefulDisconnect(e) from e try: - raw_tx = await self.network.get_transaction(tx_hash) + async with self._network_request_semaphore: + raw_tx = await self.network.get_transaction(tx_hash) except aiorpcx.jsonrpc.RPCError as e: # the electrum server can't find the tx; but it was the # one who told us about the txid!! blame is on server DIR diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py t@@ -61,9 +61,6 @@ class SynchronizerBase(NetworkJobOnDefaultServer): def __init__(self, network: 'Network'): self.asyncio_loop = network.asyncio_loop self._reset_request_counters() - # Ensure fairness between Synchronizers. e.g. if multiple wallets - # are open, a large wallet should not starve the small wallets: - self._network_request_semaphore = asyncio.Semaphore(100) NetworkJobOnDefaultServer.__init__(self, network) DIR diff --git a/electrum/util.py b/electrum/util.py t@@ -1171,6 +1171,10 @@ class NetworkJobOnDefaultServer(Logger): self.network = network self.interface = None # type: Interface self._restart_lock = asyncio.Lock() + # Ensure fairness between NetworkJobs. e.g. if multiple wallets + # are open, a large wallet's Synchronizer should not starve the small wallets: + self._network_request_semaphore = asyncio.Semaphore(100) + self._reset() asyncio.run_coroutine_threadsafe(self._restart(), network.asyncio_loop) register_callback(self._restart, ['default_server_changed']) DIR diff --git a/electrum/verifier.py b/electrum/verifier.py t@@ -96,7 +96,8 @@ class SPV(NetworkJobOnDefaultServer): async def _request_and_verify_single_proof(self, tx_hash, tx_height): try: - merkle = await self.network.get_merkle_for_transaction(tx_hash, tx_height) + async with self._network_request_semaphore: + merkle = await self.network.get_merkle_for_transaction(tx_hash, tx_height) except UntrustedServerReturnedError as e: if not isinstance(e.original_exception, aiorpcx.jsonrpc.RPCError): raise