URI: 
       tnetwork: mv request_chunk to interface - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit ab94a47b8e5a84fc9735e840903f728f30d15d14
   DIR parent 1635bc8cb3aa217668c3ed60a9b6b60b98909eaf
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Sun, 16 Sep 2018 06:09:14 +0200
       
       network: mv request_chunk to interface
       
       tthis is a bugfix: the old code always tried to connect the chunk to
       network.blockchain(). the correct behaviour is to connect to the
       blockchain of the interface.
       
       Diffstat:
         M electrum/interface.py               |      23 ++++++++++++++++++++---
         M electrum/network.py                 |      22 ++--------------------
       
       2 files changed, 22 insertions(+), 23 deletions(-)
       ---
   DIR diff --git a/electrum/interface.py b/electrum/interface.py
       t@@ -142,6 +142,7 @@ class Interface(PrintError):
                self.config_path = config_path
                self.cert_path = os.path.join(self.config_path, 'certs', self.host)
                self.blockchain = None
       +        self._requested_chunks = set()
                self.network = network
                self._set_proxy(proxy)
        
       t@@ -317,9 +318,25 @@ class Interface(PrintError):
                res = await self.session.send_request('blockchain.block.header', [height], timeout=timeout)
                return blockchain.deserialize_header(bytes.fromhex(res), height)
        
       -    async def request_chunk(self, start_height, tip):
       -        self.print_error("requesting chunk from height {}".format(start_height))
       -        return await self.network.request_chunk(start_height, tip, self.session)
       +    async def request_chunk(self, height, tip=None, *, can_return_early=False):
       +        index = height // 2016
       +        if can_return_early and index in self._requested_chunks:
       +            return
       +        self.print_error("requesting chunk from height {}".format(height))
       +        size = 2016
       +        if tip is not None:
       +            size = min(size, tip - index * 2016)
       +            size = max(size, 0)
       +        try:
       +            self._requested_chunks.add(index)
       +            res = await self.session.send_request('blockchain.block.headers', [index * 2016, size])
       +        finally:
       +            try: self._requested_chunks.remove(index)
       +            except KeyError: pass
       +        conn = self.blockchain.connect_chunk(index, res['hex'])
       +        if not conn:
       +            return conn, 0
       +        return conn, res['count']
        
            async def open_session(self, sslc, exit_early):
                header_queue = asyncio.Queue()
   DIR diff --git a/electrum/network.py b/electrum/network.py
       t@@ -223,7 +223,6 @@ class Network(PrintError):
                self.interfaces = {}               # note: needs self.interface_lock
                self.auto_connect = self.config.get('auto_connect', True)
                self.connecting = set()
       -        self.requested_chunks = set()
                self.server_queue = None
                self.server_queue_group = None
                self.asyncio_loop = asyncio.get_event_loop()
       t@@ -700,25 +699,8 @@ class Network(PrintError):
                    return False, "error: " + out
                return True, out
        
       -    async def request_chunk(self, height, tip, session=None, can_return_early=False):
       -        if session is None: session = self.interface.session
       -        index = height // 2016
       -        if can_return_early and index in self.requested_chunks:
       -            return
       -        size = 2016
       -        if tip is not None:
       -            size = min(size, tip - index * 2016)
       -            size = max(size, 0)
       -        try:
       -            self.requested_chunks.add(index)
       -            res = await session.send_request('blockchain.block.headers', [index * 2016, size])
       -        finally:
       -            try: self.requested_chunks.remove(index)
       -            except KeyError: pass
       -        conn = self.blockchain().connect_chunk(index, res['hex'])
       -        if not conn:
       -            return conn, 0
       -        return conn, res['count']
       +    async def request_chunk(self, height, tip=None, *, can_return_early=False):
       +        return await self.interface.request_chunk(height, tip=tip, can_return_early=can_return_early)
        
            @with_interface_lock
            def blockchain(self):