From a4cb70649d1c1a144f28561a261b237875680094 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Sat, 14 Mar 2015 08:43:43 +0100 Subject: [PATCH] fix synchronizer hanging when not connected. --- lib/blockchain.py | 6 ++++-- lib/network.py | 6 ++---- lib/network_proxy.py | 3 +-- lib/synchronizer.py | 5 ++++- lib/util.py | 3 +++ lib/verifier.py | 7 ++++--- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/blockchain.py b/lib/blockchain.py index 55c90695c..c1a7896f1 100644 --- a/lib/blockchain.py +++ b/lib/blockchain.py @@ -41,7 +41,7 @@ class Blockchain(util.DaemonThread): def run(self): self.init_headers_file() self.set_local_height() - print_error( "blocks:", self.local_height ) + self.print_error("%d blocks"%self.local_height) while self.is_running(): try: @@ -77,6 +77,8 @@ class Blockchain(util.DaemonThread): continue self.network.new_blockchain_height(height, i) + self.print_error("stopped") + def verify_chain(self, chain): @@ -267,7 +269,7 @@ class Blockchain(util.DaemonThread): i.send_request({'method':'blockchain.block.get_header', 'params':[h]}, queue) def retrieve_request(self, queue): - while True: + while self.is_running(): try: ir = queue.get(timeout=1) except Queue.Empty: diff --git a/lib/network.py b/lib/network.py index 7e2226810..483d5ce5b 100644 --- a/lib/network.py +++ b/lib/network.py @@ -166,10 +166,6 @@ class Network(util.DaemonThread): self.requests_queue = Queue.Queue() self.set_proxy(deserialize_proxy(self.config.get('proxy'))) - - def print_error(self, *msg): - util.print_error("[network]", *msg) - def get_server_height(self): return self.heights.get(self.default_server, 0) @@ -502,6 +498,8 @@ class Network(util.DaemonThread): for i in self.interfaces.values(): i.stop() + self.print_error("stopped") + def on_header(self, i, r): result = r.get('result') diff --git a/lib/network_proxy.py b/lib/network_proxy.py index c1866f1f9..2365c41fe 100644 --- a/lib/network_proxy.py +++ b/lib/network_proxy.py @@ -78,11 +78,10 @@ class NetworkProxy(util.DaemonThread): if response is None: break self.process(response) - self.trigger_callback('stop') if self.network: self.network.stop() - print_error("NetworkProxy: terminating") + self.print_error("stopped") def process(self, response): if self.debug: diff --git a/lib/synchronizer.py b/lib/synchronizer.py index 0beb8b982..3903ad66a 100644 --- a/lib/synchronizer.py +++ b/lib/synchronizer.py @@ -49,8 +49,9 @@ class WalletSynchronizer(util.DaemonThread): def run(self): while self.is_running(): - while not self.network.is_connected(): + if not self.network.is_connected(): time.sleep(0.1) + continue self.run_interface() def run_interface(self): @@ -183,3 +184,5 @@ class WalletSynchronizer(util.DaemonThread): # Updated gets called too many times from other places as well; if we use that signal we get the notification three times self.network.trigger_callback("new_transaction") self.was_updated = False + + self.print_error("stopped") diff --git a/lib/util.py b/lib/util.py index 4fa2cd27e..c51b4b32a 100644 --- a/lib/util.py +++ b/lib/util.py @@ -43,6 +43,9 @@ class DaemonThread(threading.Thread): with self.running_lock: self.running = False + def print_error(self, *msg): + print_error("[%s]"%self.__class__.__name__, *msg) + is_verbose = False diff --git a/lib/verifier.py b/lib/verifier.py index fa25b937c..dd6925081 100644 --- a/lib/verifier.py +++ b/lib/verifier.py @@ -97,13 +97,12 @@ class TxVerifier(util.DaemonThread): if self.network.send([ ('blockchain.transaction.get_merkle',[tx_hash, tx_height]) ], self.queue.put): print_error('requesting merkle', tx_hash) requested_merkle.append(tx_hash) - try: r = self.queue.get(timeout=0.1) except Queue.Empty: continue - - if not r: continue + if not r: + continue if r.get('error'): print_error('Verifier received an error:', r) @@ -118,6 +117,8 @@ class TxVerifier(util.DaemonThread): tx_hash = params[0] self.verify_merkle(tx_hash, result) + self.print_error("stopped") + def verify_merkle(self, tx_hash, result): tx_height = result.get('block_height')