tell users to upgrade bitcoin when RPC getmemorypool returns "Method not found"
authorForrest Voight <forrest@forre.st>
Thu, 9 Feb 2012 21:19:46 +0000 (16:19 -0500)
committerForrest Voight <forrest@forre.st>
Thu, 9 Feb 2012 21:19:46 +0000 (16:19 -0500)
p2pool/main.py
p2pool/util/deferral.py

index 1c34641..48eab4d 100644 (file)
@@ -27,7 +27,13 @@ import p2pool, p2pool.data as p2pool_data
 @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'],
index 28589ca..072d559 100644 (file)
@@ -10,6 +10,9 @@ def sleep(t):
     reactor.callLater(t, d.callback, None)
     return d
 
+class RetrySilentlyException(Exception):
+    pass
+
 def retry(message, delay, max_retries=None):
     '''
     @retry('Error getting block:', 1)
@@ -24,10 +27,11 @@ def retry(message, delay, max_retries=None):
             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)