show lag in status line
authorThomasV <thomasv@gitorious>
Fri, 4 Oct 2013 22:21:48 +0000 (00:21 +0200)
committerThomasV <thomasv@gitorious>
Fri, 4 Oct 2013 22:49:24 +0000 (00:49 +0200)
gui/qt/main_window.py
lib/blockchain.py
lib/network.py

index 2e2db66..20a565c 100644 (file)
@@ -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)
index 2c8337d..34b6114 100644 (file)
@@ -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):
@@ -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)
@@ -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)
 
 
                     
@@ -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
@@ -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
+
 
 
 
index bdeb6a8..546a4ae 100644 (file)
@@ -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):
@@ -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()
@@ -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')