Browse Source

fix network connection issues

283
ThomasV 10 years ago
parent
commit
73d8ba24d9
  1. 4
      lib/interface.py
  2. 30
      lib/network.py

4
lib/interface.py

@ -310,10 +310,10 @@ class TcpInterface(threading.Thread):
def run(self): def run(self):
self.s = self.get_socket() self.s = self.get_socket()
if self.s: if self.s:
self.s.settimeout(60) self.pipe = util.SocketPipe(self.s)
self.s.settimeout(2)
self.is_connected = True self.is_connected = True
print_error("connected to", self.host, self.port) print_error("connected to", self.host, self.port)
self.pipe = util.SocketPipe(self.s)
self.change_status() self.change_status()
if not self.is_connected: if not self.is_connected:

30
lib/network.py

@ -112,7 +112,6 @@ class Network(threading.Thread):
self.irc_servers = {} # returned by interface (list from irc) self.irc_servers = {} # returned by interface (list from irc)
self.disconnected_servers = set([]) self.disconnected_servers = set([])
self.disconnected_time = time.time()
self.recent_servers = self.config.get('recent_servers',[]) # successful connections self.recent_servers = self.config.get('recent_servers',[]) # successful connections
self.pending_servers = set() self.pending_servers = set()
@ -388,29 +387,30 @@ class Network(threading.Thread):
self.response_queue.put({'id':_id, 'result':self.addresses[addr]}) self.response_queue.put({'id':_id, 'result':self.addresses[addr]})
return return
try:
self.interface.send_request(request) self.interface.send_request(request)
except:
# put it back in the queue
print_error("warning: interface not ready for", request)
self.requests_queue.put(request)
time.sleep(0.1)
def run(self): def run(self):
disconnected_time = time.time()
while self.is_running(): while self.is_running():
try: try:
i, response = self.queue.get(timeout=0.1) i, response = self.queue.get(timeout=0.1)
except Queue.Empty: except Queue.Empty:
if len(self.interfaces) + len(self.pending_servers) < self.num_server: if len(self.interfaces) + len(self.pending_servers) < self.num_server:
self.start_random_interface() self.start_random_interface()
if not self.interface.is_connected and self.default_server not in self.disconnected_servers:
print_error("forcing reconnection")
self.queue.put((self.interface, None))
if not self.interfaces: if not self.interfaces:
if time.time() - self.disconnected_time > DISCONNECTED_RETRY_INTERVAL: if time.time() - disconnected_time > DISCONNECTED_RETRY_INTERVAL:
print_error('network: retrying connections') print_error('network: retrying connections')
self.disconnected_servers = set([]) self.disconnected_servers = set([])
self.disconnected_time = time.time() disconnected_time = time.time()
if not self.interface.is_connected:
if time.time() - self.disconnected_time > DISCONNECTED_RETRY_INTERVAL:
print_error("forcing reconnection")
self.queue.put((self.interface, None))
self.disconnected_time = time.time()
continue continue
if response is not None: if response is not None:
@ -430,15 +430,12 @@ class Network(threading.Thread):
self.send_subscriptions() self.send_subscriptions()
self.set_status('connected') self.set_status('connected')
else: else:
self.disconnected_servers.add(i.server)
if i.server in self.interfaces: if i.server in self.interfaces:
self.remove_interface(i) self.remove_interface(i)
if i.server in self.heights: if i.server in self.heights:
self.heights.pop(i.server) self.heights.pop(i.server)
if i == self.interface: if i == self.interface:
self.set_status('disconnected') self.set_status('disconnected')
if not self.interface.is_connected:
if self.config.get('auto_cycle'): if self.config.get('auto_cycle'):
self.switch_to_random_interface() self.switch_to_random_interface()
else: else:
@ -448,7 +445,8 @@ class Network(threading.Thread):
self.switch_to_interface(self.interfaces[self.default_server]) self.switch_to_interface(self.interfaces[self.default_server])
else: else:
self.interface = self.start_interface(self.default_server) self.interface = self.start_interface(self.default_server)
# add it at the end
self.disconnected_servers.add(i.server)
print_error("Network: Stopping interfaces") print_error("Network: Stopping interfaces")
for i in self.interfaces.values(): for i in self.interfaces.values():

Loading…
Cancel
Save