URI: 
       tfix auto-connect: do not use a random interface - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 59bc22085627c2ffe21cfb021f59064a8fad814e
   DIR parent 8c6866fb910b9f54056bdf97796c293e505d2227
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sun, 26 Mar 2017 20:22:30 +0200
       
       fix auto-connect: do not use a random interface
       
       Diffstat:
         M lib/network.py                      |      20 +++++++++++---------
       
       1 file changed, 11 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/lib/network.py b/lib/network.py
       t@@ -227,9 +227,7 @@ class Network(util.DaemonThread):
                self.banner = ''
                self.donation_address = ''
                self.relay_fee = None
       -        self.heights = {}
       -        self.merkle_roots = {}
       -        self.utxo_roots = {}
       +        self.headers = {}
                # callbacks passed with subscriptions
                self.subscriptions = defaultdict(list)
                self.sub_cache = {}
       t@@ -297,7 +295,8 @@ class Network(util.DaemonThread):
                    pass
        
            def get_server_height(self):
       -        return self.heights.get(self.default_server, 0)
       +        h = self.headers.get(self.default_server)
       +        return h['block_height'] if h else 0
        
            def server_is_lagging(self):
                sh = self.get_server_height()
       t@@ -494,7 +493,12 @@ class Network(util.DaemonThread):
                    if suggestion and self.protocol == deserialize_server(suggestion)[2]:
                        self.switch_to_interface(suggestion)
                    else:
       -                self.switch_to_random_interface()
       +                # switch to one that has the correct header (not height)
       +                header = self.get_header(self.get_local_height())
       +                filtered = map(lambda x:x[0], filter(lambda x: x[1]==header, self.headers.items()))
       +                if filtered:
       +                    choice = random.choice(filtered)
       +                    self.switch_to_interface(choice)
        
            def switch_to_interface(self, server):
                '''Switch to server as our interface.  If no connection exists nor
       t@@ -676,7 +680,7 @@ class Network(util.DaemonThread):
                    self.set_status('disconnected')
                if server in self.interfaces:
                    self.close_interface(self.interfaces[server])
       -            self.heights.pop(server, None)
       +            self.headers.pop(server, None)
                    self.notify('interfaces')
        
            def new_interface(self, server, socket):
       t@@ -857,9 +861,7 @@ class Network(util.DaemonThread):
                height = header.get('block_height')
                if not height:
                    return
       -        self.heights[i.server] = height
       -        self.merkle_roots[i.server] = header.get('merkle_root')
       -        self.utxo_roots[i.server] = header.get('utxo_root')
       +        self.headers[i.server] = header
        
                # Queue this interface's height for asynchronous catch-up
                self.bc_requests.append((i, {'if_height': height}))