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