join threads during server shutdown
[electrum-server.git] / backends / bitcoind / blockchain_processor.py
index 18117fa..0a133db 100644 (file)
@@ -87,7 +87,8 @@ class BlockchainProcessor(Processor):
         self.memorypool_update()
         print_log("Memory pool initialized.")
 
-        threading.Timer(10, self.main_iteration).start()
+        self.timer = threading.Timer(10, self.main_iteration)
+        self.timer.start()
 
 
 
@@ -490,10 +491,10 @@ class BlockchainProcessor(Processor):
                 error = str(e) + ': ' + address
                 print_log("error:", error)
 
-        elif method == 'blockchain.address.get_path':
+        elif method == 'blockchain.address.get_proof':
             try:
                 address = str(params[0])
-                result = self.storage.get_address_path(address)
+                result = self.storage.get_proof(address)
             except BaseException, e:
                 error = str(e) + ': ' + address
                 print_log("error:", error)
@@ -506,12 +507,22 @@ class BlockchainProcessor(Processor):
                 error = str(e) + ': ' + address
                 print_log("error:", error)
 
+        elif method == 'blockchain.utxo.get_address':
+            try:
+                txid = str(params[0])
+                pos = int(params[1])
+                txi = (txid + int_to_hex(pos, 4)).decode('hex')
+                result = self.storage.get_address(txi)
+            except BaseException, e:
+                error = str(e)
+                print_log("error:", error, params)
+
         elif method == 'blockchain.block.get_header':
             if cache_only:
                 result = -1
             else:
                 try:
-                    height = params[0]
+                    height = int(params[0])
                     result = self.get_header(height)
                 except BaseException, e:
                     error = str(e) + ': %d' % height
@@ -522,7 +533,7 @@ class BlockchainProcessor(Processor):
                 result = -1
             else:
                 try:
-                    index = params[0]
+                    index = int(params[0])
                     result = self.get_chunk(index)
                 except BaseException, e:
                     error = str(e) + ': %d' % index
@@ -602,7 +613,7 @@ class BlockchainProcessor(Processor):
 
     def catch_up(self, sync=True):
 
-        prh = None
+        prev_root_hash = None
         while not self.shared.stopped():
 
             self.mtime('')
@@ -738,10 +749,17 @@ class BlockchainProcessor(Processor):
             # TODO: update cache here. if new value equals cached value, do not send notification
             self.address_queue.put((address,sessions))
 
+    
+    def close(self):
+        self.timer.join()
+        print_log("Closing database...")
+        self.storage.close()
+        print_log("Database is closed")
+
+
     def main_iteration(self):
         if self.shared.stopped():
-            print_log("blockchain processor terminating")
-            self.storage.close()
+            print_log("Stopping timer")
             return
 
         with self.dblock:
@@ -784,7 +802,7 @@ class BlockchainProcessor(Processor):
                         'params': [addr, status],
                         })
 
-        if not self.shared.stopped():
-            threading.Timer(10, self.main_iteration).start()
-        else:
-            print_log("blockchain processor terminating")
+        # next iteration 
+        self.timer = threading.Timer(10, self.main_iteration)
+        self.timer.start()
+