예제 #1
0
def retryCall(fn,
              args=None,
              keywordArgs=None,
              failureTester=None,
              sleepManager=None):
    """Calls the given function, automatically retrying as necessary.

  Arguments:
    fn: The function to call.
    failureTester: Function called with a failure.  The failure should be re-raised if it is not allowable.
    sleepManager: A sleep manager to control how long to sleep between retries.
    args: Args to pass to the function.
    keywordArgs: keywordArgs to pass to the function.

  Returns:
    A deferred that will be called on success.
  """
    sleepManager = sleepManager or time.SleepManager()
    while True:
        try:
            result = yield fn(*args, **keywordArgs)
            defer.returnValue(result)
        except Exception:  # pylint: disable=W0703
            failureTester(failure.Failure())
            yield sleepManager.sleep()
예제 #2
0
 def __init__(self, fn, failureTester, sleepManager, args, keywordArgs):
     defer.Deferred.__init__(self)
     self.__fn = fn
     self.__failureTester = failureTester
     self.__sleepManager = sleepManager or time.SleepManager()
     self.__args = args or []
     self.__keywordArgs = keywordArgs or {}
     self.__currentTry = None
     self.__tryCall()
예제 #3
0
    def testTwoTries(self):
        """Test a two try cache."""
        original = mox.MockAnything()
        original.getHostByName('google.com').AndReturn(
            defer.fail(
                failure.Failure(error.DNSLookupError('Fake DNS failure'))))
        original.getHostByName('google.com').AndReturn(
            defer.succeed('1.2.3.4'))
        mox.Replay(original)

        cache = dnsRetry.RetryingDNS(original,
                                     tries=2,
                                     sleep=time.SleepManager(0, 0, 0))
        result = cache.getHostByName('google.com')
        self.assertEquals(result, '1.2.3.4')
        mox.Verify(original)
예제 #4
0
 def __init__(self, original, tries=5, sleep=time.SleepManager(5, 60, 10)):
     self._original = original
     self._tries = tries
     self._sleep = sleep