URI: 
       tshow lag in status line - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit c0abd3c34eaf1220c8ac08ab68f2fe5ec5988679
   DIR parent a38298c5ee583625318ce72f0e6d13254c62a88c
  HTML Author: ThomasV <thomasv@gitorious>
       Date:   Sat,  5 Oct 2013 00:21:48 +0200
       
       show lag in status line
       
       Diffstat:
         M gui/qt/main_window.py               |       4 ++--
         M lib/blockchain.py                   |      36 ++++++++++++-------------------
         M lib/network.py                      |      15 +++++++++++++++
       
       3 files changed, 31 insertions(+), 24 deletions(-)
       ---
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -538,8 +538,8 @@ class ElectrumWindow(QMainWindow):
                    if not self.wallet.up_to_date:
                        text = _("Synchronizing...")
                        icon = QIcon(":icons/status_waiting.png")
       -            elif self.network.is_lagging:
       -                text = _("Server is lagging")
       +            elif self.network.server_lag > 1:
       +                text = _("Server is lagging (%d blocks)"%self.network.server_lag)
                        icon = QIcon(":icons/status_lagging.png")
                    else:
                        c, u = self.wallet.get_account_balance(self.current_account)
   DIR diff --git a/lib/blockchain.py b/lib/blockchain.py
       t@@ -36,8 +36,6 @@ class Blockchain(threading.Thread):
                self.headers_url = 'http://headers.electrum.org/blockchain_headers'
                self.set_local_height()
                self.queue = Queue.Queue()
       -        self.servers_height = {}
       -        self.is_lagging = False
        
            
            def stop(self):
       t@@ -69,11 +67,13 @@ class Blockchain(threading.Thread):
                    if not header: continue
                    
                    height = header.get('block_height')
       -            self.servers_height[i.server] = height
       +
       +            if height <= self.local_height:
       +                continue
        
                    if height > self.local_height + 50:
       -                self.get_chunks(i, header, height)
       -                self.network.trigger_callback('updated')
       +                if not self.get_and_verify_chunks(i, header, height):
       +                    continue
        
                    if height > self.local_height:
                        # get missing parts from interface (until it connects to my chain)
       t@@ -91,22 +91,9 @@ class Blockchain(threading.Thread):
                        else:
                            print_error("error", i.server)
                            # todo: dismiss that server
       +                    continue
        
       -            if self.network.is_connected():
       -                h = self.servers_height.get(self.network.interface.server)
       -            else:
       -                h = None
       -
       -            if h is not None and h < height - 1:
       -                print_error( "Server is lagging", height, h)
       -                if self.config.get('auto_cycle'):
       -                    self.network.set_server(i.server)
       -                else:
       -                    self.network.is_lagging = True
       -            else:
       -                self.network.is_lagging = False
       -                
       -            self.network.trigger_callback('updated')
       +            self.network.new_blockchain_height(height, i)
        
        
                            
       t@@ -385,7 +372,7 @@ class Blockchain(threading.Thread):
                        return chain
        
        
       -    def get_chunks(self, i, header, height):
       +    def get_and_verify_chunks(self, i, header, height):
                requested_chunks = []
                queue = Queue.Queue()
                min_index = (self.local_height + 1)/2016
       t@@ -412,9 +399,14 @@ class Blockchain(threading.Thread):
                    result = r['result']
        
                    index = params[0]
       -            self.verify_chunk(index, result)
       +            try:
       +                self.verify_chunk(index, result)
       +            except:
       +                return False
                    requested_chunks.remove(index)
        
       +        return True
       +
        
        
        
   DIR diff --git a/lib/network.py b/lib/network.py
       t@@ -61,6 +61,7 @@ class Network(threading.Thread):
                self.interface = None
                self.proxy = self.config.get('proxy')
                self.heights = {}
       +        self.server_lag = 0
        
                dir_path = os.path.join( self.config.path, 'certs')
                if not os.path.exists(dir_path):
       t@@ -206,6 +207,18 @@ class Network(threading.Thread):
                self.config.set_key('recent_servers', self.recent_servers)
        
        
       +    def new_blockchain_height(self, blockchain_height, i):
       +        if self.is_connected():
       +            h = self.heights.get(self.interface.server)
       +            if h:
       +                self.server_lag = blockchain_height - h
       +                if self.server_lag > 1:
       +                    print_error( "Server is lagging", blockchain_height, h)
       +                    if self.config.get('auto_cycle'):
       +                        self.set_server(i.server)
       +        
       +        self.trigger_callback('updated')
       +
        
            def run(self):
                self.blockchain.start()
       t@@ -231,6 +244,8 @@ class Network(threading.Thread):
                    else:
                        self.disconnected_servers.append(i.server)
                        self.interfaces.pop(i.server)
       +                if i.server in self.heights:
       +                    self.heights.pop(i.server)
                        if i == self.interface:
                            self.interface = None
                            self.trigger_callback('disconnected')