maintain NUM_SERVERS interfaces
authorThomasV <thomasv@gitorious>
Fri, 4 Oct 2013 08:38:03 +0000 (10:38 +0200)
committerThomasV <thomasv@gitorious>
Fri, 4 Oct 2013 08:38:03 +0000 (10:38 +0200)
lib/network.py

index 02cf727..765d876 100644 (file)
@@ -24,6 +24,8 @@ DEFAULT_SERVERS = {
 }
 
 
+NUM_SERVERS = 8
+
 
 def filter_protocol(servers, p):
     l = []
@@ -60,7 +62,6 @@ class Network(threading.Thread):
         if not os.path.exists(dir_path):
             os.mkdir(dir_path)
 
-
         # default subscriptions
         self.subscriptions = {}
         self.subscriptions[self.on_banner] = [('server.banner',[])]
@@ -137,7 +138,7 @@ class Network(threading.Thread):
             self.start_interface(self.default_server)
             self.interface = self.interfaces[self.default_server]
 
-        for i in range(8):
+        for i in range(NUM_SERVERS):
             self.start_random_interface()
             
         if not self.interface:
@@ -185,7 +186,12 @@ class Network(threading.Thread):
             self.running = True
 
         while self.is_running():
-            i = self.queue.get()
+            try:
+                i = self.queue.get(timeout = 30)
+            except Queue.Empty:
+                if len(self.interfaces) < NUM_SERVERS:
+                    self.start_random_interface()
+                continue
 
             if i.is_connected:
                 i.send([ ('blockchain.headers.subscribe',[])], self.on_header)
@@ -195,15 +201,16 @@ class Network(threading.Thread):
             else:
                 self.disconnected_servers.append(i.server)
                 self.interfaces.pop(i.server)
-                self.start_random_interface()
-                
                 if i == self.interface:
-                    if self.config.get('auto_cycle'):
-                        self.interface = random.choice(self.interfaces.values())
-                        self.config.set_key('server', self.interface.server, False)
-                    else:
-                        self.trigger_callback('disconnected')
-                
+                    self.interface = None
+                    self.trigger_callback('disconnected')
+
+            if self.interface is None and self.config.get('auto_cycle') and self.interfaces:
+                self.interface = random.choice(self.interfaces.values())
+                self.config.set_key('server', self.interface.server, False)
+                self.trigger_callback('connected')
+
+
     def on_header(self, i, r):
         result = r.get('result')
         if not result: return