URI: 
       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