Consistency in handling of self.interface

switch_to_interface() becomes the common place where
self.interface is set; therefore self.interface is not None
precisely when self.default_server is connected.  Previously some
places required it to be connected and some didn't.  Also an
interface change now sends the 'updated' notification
consistently - previously some did and some didn't.

Have network_start() call start_interfaces() - this also means
network restarts now do this.

Fix apparent off-by-one in start_interfaces()
This commit is contained in:
Neil Booth 2015-05-22 09:13:09 +09:00
parent c918e74039
commit 86626d8080
1 changed files with 19 additions and 21 deletions

View File

@ -278,12 +278,10 @@ class Network(util.DaemonThread):
return out
def start_interface(self, server):
if server in self.interfaces.keys():
return
i = interface.Interface(server, self.queue, self.config)
self.pending_servers.add(server)
i.start()
return i
if not server in self.interfaces.keys():
i = interface.Interface(server, self.queue, self.config)
self.pending_servers.add(server)
i.start()
def start_random_interface(self):
server = self.random_server()
@ -291,13 +289,12 @@ class Network(util.DaemonThread):
self.start_interface(server)
def start_interfaces(self):
self.interface = self.start_interface(self.default_server)
for i in range(self.num_server):
self.start_interface(self.default_server)
for i in range(self.num_server - 1):
self.start_random_interface()
def start(self):
self.running = True
self.start_interfaces()
self.blockchain.start()
util.DaemonThread.start(self)
@ -320,6 +317,7 @@ class Network(util.DaemonThread):
self.disconnected_servers = set([])
self.protocol = protocol
self.set_proxy(proxy)
self.start_interfaces()
def stop_network(self):
# FIXME: this forgets to handle pending servers...
@ -351,15 +349,16 @@ class Network(util.DaemonThread):
while self.interfaces:
i = random.choice(self.interfaces.values())
if i.is_connected():
self.switch_to_interface(i)
self.switch_to_interface(i.server)
break
else:
self.remove_interface(i)
def switch_to_interface(self, interface):
server = interface.server
def switch_to_interface(self, server):
'''Switch to server as our interface, it must be in self.interfaces'''
assert server in self.interfaces
self.print_error("switching to", server)
self.interface = interface
self.interface = self.interfaces[server]
self.default_server = server
self.send_subscriptions()
self.set_status('connected')
@ -368,7 +367,7 @@ class Network(util.DaemonThread):
def stop_interface(self):
self.interface.stop()
self.interface = None
def set_server(self, server):
if self.default_server == server and self.is_connected():
@ -387,9 +386,9 @@ class Network(util.DaemonThread):
self.default_server = server
if server in self.interfaces.keys():
self.switch_to_interface( self.interfaces[server] )
self.switch_to_interface(server)
else:
self.interface = self.start_interface(server)
self.start_interface(server)
def add_recent_server(self, i):
@ -425,9 +424,8 @@ class Network(util.DaemonThread):
self.add_interface(i)
self.add_recent_server(i)
i.send_request({'method':'blockchain.headers.subscribe','params':[]})
if i == self.interface:
self.send_subscriptions()
self.set_status('connected')
if i.server == self.default_server:
self.switch_to_interface(i.server)
else:
if i.server in self.interfaces:
self.remove_interface(i)
@ -509,7 +507,7 @@ class Network(util.DaemonThread):
self.switch_to_random_interface()
else:
if self.default_server in self.interfaces.keys():
self.switch_to_interface(self.interfaces[self.default_server])
self.switch_to_interface(self.default_server)
else:
if self.default_server in self.disconnected_servers:
if now - self.server_retry_time > SERVER_RETRY_INTERVAL:
@ -518,7 +516,7 @@ class Network(util.DaemonThread):
else:
if self.default_server not in self.pending_servers:
self.print_error("forcing reconnection")
self.interface = self.start_interface(self.default_server)
self.start_interface(self.default_server)
def run(self):
while self.is_running():