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()
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()
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)
def __init__(self, original, tries=5, sleep=time.SleepManager(5, 60, 10)): self._original = original self._tries = tries self._sleep = sleep