@deferral.retry('Error getting work from bitcoind:', 3)
@defer.inlineCallbacks
def getwork(bitcoind):
- work = yield bitcoind.rpc_getmemorypool()
+ try:
+ work = yield bitcoind.rpc_getmemorypool()
+ except jsonrpc.Error, e:
+ if e.code == -32601: # Method not found
+ print >>sys.stderr, 'Error: Bitcoin version too old! Upgrade to v0.5 or newer!'
+ raise deferral.RetrySilentlyException()
+ raise
packed_transactions = [x.decode('hex') for x in work['transactions']]
defer.returnValue(dict(
version=work['version'],
reactor.callLater(t, d.callback, None)
return d
+class RetrySilentlyException(Exception):
+ pass
+
def retry(message, delay, max_retries=None):
'''
@retry('Error getting block:', 1)
for i in itertools.count():
try:
result = yield func(*args, **kwargs)
- except:
+ except Exception, e:
if i == max_retries:
raise
- log.err(None, message)
+ if not isinstance(e, RetrySilentlyException):
+ log.err(None, message)
yield sleep(delay)
else:
defer.returnValue(result)