retry merged block submittal
authorForrest Voight <forrest@forre.st>
Sat, 7 Jan 2012 08:05:39 +0000 (03:05 -0500)
committerForrest Voight <forrest@forre.st>
Sat, 7 Jan 2012 08:05:39 +0000 (03:05 -0500)
p2pool/main.py
p2pool/util/deferral.py

index e0d2a5d..620ed5c 100644 (file)
@@ -518,7 +518,7 @@ def main(args, net, datadir_path):
                 try:
                     if aux_work is not None and (pow_hash <= aux_work['target'] or p2pool.DEBUG):
                         assert bitcoin_data.HashType().pack(aux_work['hash'])[::-1].encode('hex') == transactions[0]['tx_ins'][0]['script'][-32-8:-8].encode('hex')
-                        df = merged_proxy.rpc_getauxblock(
+                        df = deferral.retry('Error submitting merged block: (will retry)', 10, 10)(merged_proxy.rpc_getauxblock)(
                             bitcoin_data.HashType().pack(aux_work['hash'])[::-1].encode('hex'),
                             bitcoin_data.aux_pow_type.pack(dict(
                                 merkle_tx=dict(
@@ -532,12 +532,15 @@ def main(args, net, datadir_path):
                                 parent_block_header=header,
                             )).encode('hex'),
                         )
-                        @df.addBoth
+                        @df.addCallback
                         def _(result):
                             if result != (pow_hash <= aux_work['target']):
                                 print >>sys.stderr, 'Merged block submittal result: %s Expected: %s' % (result, pow_hash <= aux_work['target'])
                             else:
                                 print 'Merged block submittal result: %s' % (result,)
+                        @df.addErrback
+                        def _(err):
+                            log.err(err, 'Error submitting merged block:')
                 except:
                     log.err(None, 'Error while processing merged mining POW:')
                 
index 738326a..72733f8 100644 (file)
@@ -1,5 +1,7 @@
 from __future__ import division
 
+import itertools
+
 from twisted.internet import defer, reactor
 from twisted.python import failure, log
 
@@ -8,7 +10,7 @@ def sleep(t):
     reactor.callLater(t, d.callback, None)
     return d
 
-def retry(message, delay):
+def retry(message, delay, max_retries=None):
     '''
     @retry('Error getting block:', 1)
     @defer.inlineCallbacks
@@ -19,10 +21,12 @@ def retry(message, delay):
     def retry2(func):
         @defer.inlineCallbacks
         def f(*args, **kwargs):
-            while True:
+            for i in itertools.count():
                 try:
                     result = yield func(*args, **kwargs)
                 except:
+                    if i == max_retries:
+                        raise
                     log.err(None, message)
                     yield sleep(delay)
                 else: