from __future__ import division
import itertools
+import random
+import sys
from twisted.internet import defer, reactor
from twisted.python import failure, log
reactor.callLater(t, d.callback, None)
return d
+def run_repeatedly(f, *args, **kwargs):
+ current_dc = [None]
+ def step():
+ delay = f(*args, **kwargs)
+ current_dc[0] = reactor.callLater(delay, step)
+ step()
+ def stop():
+ current_dc[0].cancel()
+ return stop
+
class RetrySilentlyException(Exception):
pass
-def retry(message='Error:', delay=3, max_retries=None):
+def retry(message='Error:', delay=3, max_retries=None, traceback=True):
'''
@retry('Error getting block:', 1)
@defer.inlineCallbacks
if i == max_retries:
raise
if not isinstance(e, RetrySilentlyException):
- log.err(None, message)
+ if traceback:
+ log.err(None, message)
+ else:
+ print >>sys.stderr, message, e
yield sleep(delay)
else:
defer.returnValue(result)
self.waiting.pop(key).callback(None)
def eb(fail):
self.waiting.pop(key).callback(None)
+ if fail.check(RetrySilentlyException):
+ return
print
print 'Error when requesting noncached value:'
fail.printTraceback()