replace task.LoopingCall's with deferral.RobustLoopingCall that catches errors and...
[p2pool.git] / p2pool / bitcoin / height_tracker.py
index c820ec2..e5119fb 100644 (file)
@@ -1,8 +1,9 @@
-from twisted.internet import defer, task
+from twisted.internet import defer
 from twisted.python import log
 
+import p2pool
 from p2pool.bitcoin import data as bitcoin_data
-from p2pool.util import deferral, forest, variable
+from p2pool.util import deferral, forest, jsonrpc, variable
 
 class HeaderWrapper(object):
     __slots__ = 'hash previous_hash'.split(' ')
@@ -28,16 +29,16 @@ class HeightTracker(object):
         self._watch2 = self._factory.new_block.watch(self._request)
         
         self._requested = set()
-        self._clear_task = task.LoopingCall(self._requested.clear)
+        self._clear_task = deferral.RobustLoopingCall(self._requested.clear)
         self._clear_task.start(60)
         
         self._last_notified_size = 0
         
         self.updated = variable.Event()
         
-        self._think_task = task.LoopingCall(self._think)
+        self._think_task = deferral.RobustLoopingCall(self._think)
         self._think_task.start(15)
-        self._think2_task = task.LoopingCall(self._think2)
+        self._think2_task = deferral.RobustLoopingCall(self._think2)
         self._think2_task.start(15)
     
     def _think(self):
@@ -58,7 +59,7 @@ class HeightTracker(object):
         changed = False
         for header in headers:
             hw = HeaderWrapper.from_header(header)
-            if hw.hash in self._tracker.shares:
+            if hw.hash in self._tracker.items:
                 continue
             changed = True
             self._tracker.add(hw)
@@ -66,13 +67,13 @@ class HeightTracker(object):
             self.updated.happened()
         self._think()
         
-        if len(self._tracker.shares) >= self._last_notified_size + 100:
-            print 'Have %i/%i block headers' % (len(self._tracker.shares), self._backlog_needed)
-            self._last_notified_size = len(self._tracker.shares)
+        if len(self._tracker.items) >= self._last_notified_size + 100:
+            print 'Have %i/%i block headers' % (len(self._tracker.items), self._backlog_needed)
+            self._last_notified_size = len(self._tracker.items)
     
     @defer.inlineCallbacks
     def _request(self, last):
-        if last in self._tracker.shares:
+        if last in self._tracker.items:
             return
         if last in self._requested:
             return
@@ -95,10 +96,11 @@ def get_height_rel_highest_func(bitcoind, factory, best_block_func, net):
         def height_cacher(block_hash):
             try:
                 x = yield bitcoind.rpc_getblock('%x' % (block_hash,))
-            except jsonrpc.Error, e:
-                if e.code == -5 and not p2pool.DEBUG:
+            except jsonrpc.Error_for_code(-5): # Block not found
+                if not p2pool.DEBUG:
                     raise deferral.RetrySilentlyException()
-                raise
+                else:
+                    raise
             defer.returnValue(x['blockcount'] if 'blockcount' in x else x['height'])
         best_height_cached = variable.Variable((yield deferral.retry()(height_cacher)(best_block_func())))
         def get_height_rel_highest(block_hash):