From 86626d8080824c46886cf0ebf7e305290da68c5e Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Fri, 22 May 2015 09:13:09 +0900 Subject: [PATCH] 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() --- lib/network.py | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/network.py b/lib/network.py index 3966fa81a..44ee13274 100644 --- a/lib/network.py +++ b/lib/network.py @@ -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():