fix memory pool and cache
[electrum-server.git] / backends / bitcoind / blockchain_processor.py
index 78ef690..ae3d590 100644 (file)
@@ -669,16 +669,23 @@ class BlockchainProcessor(Processor):
                 self.mempool_addresses.pop(tx_hash)
 
         # rebuild histories
-        with self.mempool_lock:
-            self.mempool_hist = {}
-            for tx_hash, addresses in self.mempool_addresses.items():
-                for addr in addresses:
-                    h = self.mempool_hist.get(addr, [])
-                    if tx_hash not in h: 
-                        h.append( tx_hash )
-                        self.mempool_hist[addr] = h
-                        self.invalidate_cache(addr)
+        new_mempool_hist = {}
+        for tx_hash, addresses in self.mempool_addresses.items():
+            for addr in addresses:
+                h = new_mempool_hist.get(addr, [])
+                if tx_hash not in h: 
+                    h.append( tx_hash )
+                new_mempool_hist[addr] = h
+
+        for addr in new_mempool_hist.keys():
+            if addr in self.mempool_hist.keys():
+                if self.mempool_hist[addr] != new_mempool_hist[addr]: 
+                    self.invalidate_cache(addr)
+            else:
+                self.invalidate_cache(addr)
 
+        with self.mempool_lock:
+            self.mempool_hist = new_mempool_hist
 
 
 
@@ -688,6 +695,9 @@ class BlockchainProcessor(Processor):
                 print_log( "cache: invalidating", address )
                 self.history_cache.pop(address)
 
+        if address in self.watched_addresses:
+            self.address_queue.put(address)
+
 
 
     def main_iteration(self):
@@ -703,7 +713,7 @@ class BlockchainProcessor(Processor):
 
         self.memorypool_update()
         t3 = time.time()
-        print "mempool:", len(self.mempool_addresses), len(self.mempool_hist), "%.3fs"%(t3 - t2)
+        # print "mempool:", len(self.mempool_addresses), len(self.mempool_hist), "%.3fs"%(t3 - t2)
 
 
         if self.sent_height != self.height:
@@ -723,6 +733,7 @@ class BlockchainProcessor(Processor):
             if addr in self.watched_addresses:
                 status = self.get_status( addr )
                 self.push_response({ 'id': None, 'method':'blockchain.address.subscribe', 'params':[addr, status] })
+                self.push_response({ 'id': None, 'method':'blockchain.address.subscribe2', 'params':[addr, status] })
 
 
         if not self.shared.stopped():