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:
parent
c918e74039
commit
86626d8080
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue