示例#1
0
	def testSucceedLater(self):
		loop = global_event_loop()
		func_coroutine = self._wrap_coroutine_func(SucceedLater(1))
		decorator = retry(try_max=9999,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine, loop=loop)
		result = loop.run_until_complete(decorated_func())
		self.assertEqual(result, 'success')
示例#2
0
	def testSucceedNever(self):
		loop = global_event_loop()
		func_coroutine = self._wrap_coroutine_func(SucceedNever())
		decorator = retry(try_max=4, try_timeout=None,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine, loop=loop)
		done, pending = loop.run_until_complete(asyncio.wait([decorated_func()], loop=loop))
		self.assertEqual(len(done), 1)
		self.assertTrue(isinstance(done.pop().exception().__cause__, SucceedNeverException))
示例#3
0
	def testHangForeverReraise(self):
		loop = global_event_loop()
		func_coroutine = self._wrap_coroutine_func(HangForever())
		decorator = retry(reraise=True, try_max=2, try_timeout=0.1,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine, loop=loop)
		done, pending = loop.run_until_complete(asyncio.wait([decorated_func()], loop=loop))
		self.assertEqual(len(done), 1)
		self.assertTrue(isinstance(done.pop().exception(), asyncio.TimeoutError))
示例#4
0
 def testSucceedLater(self):
     loop = global_event_loop()
     func_coroutine = self._wrap_coroutine_func(SucceedLater(1))
     decorator = retry(try_max=9999,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine, loop=loop)
     result = loop.run_until_complete(decorated_func())
     self.assertEqual(result, 'success')
示例#5
0
	def testSucceedLater(self):
		loop = global_event_loop()
		func = SucceedLater(1)
		func_coroutine = functools.partial(loop.run_in_executor, None, func)
		decorator = retry(try_max=9999,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine)
		result = loop.run_until_complete(decorated_func())
		self.assertEqual(result, 'success')
示例#6
0
	def testHangForever(self):
		loop = global_event_loop()
		func = HangForever()
		func_coroutine = functools.partial(loop.run_in_executor, None, func)
		decorator = retry(try_max=2, try_timeout=0.1,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine)
		done, pending = loop.run_until_complete(wait([decorated_func()]))
		self.assertEqual(len(done), 1)
		self.assertTrue(isinstance(done[0].exception().__cause__, TimeoutError))
示例#7
0
	def testSucceedNeverReraise(self):
		loop = global_event_loop()
		func = SucceedNever()
		func_coroutine = functools.partial(loop.run_in_executor, None, func)
		decorator = retry(reraise=True, try_max=4, try_timeout=None,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine)
		done, pending = loop.run_until_complete(wait([decorated_func()]))
		self.assertEqual(len(done), 1)
		self.assertTrue(isinstance(done[0].exception(), SucceedNeverException))
示例#8
0
 def testSucceedLater(self):
     loop = global_event_loop()._asyncio_wrapper
     func = SucceedLater(1)
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(try_max=9999,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     result = loop.run_until_complete(decorated_func())
     self.assertEqual(result, 'success')
示例#9
0
	def testOverallTimeoutWithTimeoutError(self):
		loop = global_event_loop()
		# results in TimeoutError because it hangs forever
		func_coroutine = self._wrap_coroutine_func(HangForever())
		decorator = retry(try_timeout=0.1, overall_timeout=0.3,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine, loop=loop)
		done, pending = loop.run_until_complete(asyncio.wait([decorated_func()], loop=loop))
		self.assertEqual(len(done), 1)
		self.assertTrue(isinstance(done.pop().exception().__cause__, asyncio.TimeoutError))
示例#10
0
	def testCancelRetry(self):
		loop = global_event_loop()
		func_coroutine = self._wrap_coroutine_func(SucceedNever())
		decorator = retry(try_timeout=0.1,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine, loop=loop)
		future = decorated_func()
		loop.call_later(0.3, future.cancel)
		done, pending = loop.run_until_complete(asyncio.wait([future], loop=loop))
		self.assertEqual(len(done), 1)
		self.assertTrue(done.pop().cancelled())
示例#11
0
	def testCancelRetry(self):
		loop = global_event_loop()
		func = SucceedNever()
		func_coroutine = functools.partial(loop.run_in_executor, None, func)
		decorator = retry(try_timeout=0.1,
			delay_func=RandomExponentialBackoff(multiplier=0.1, base=2))
		decorated_func = decorator(func_coroutine)
		future = decorated_func()
		loop.call_later(0.3, future.cancel)
		done, pending = loop.run_until_complete(wait([future]))
		self.assertEqual(len(done), 1)
		self.assertTrue(done[0].cancelled())
示例#12
0
 def testHangForever(self):
     loop = global_event_loop()
     func_coroutine = self._wrap_coroutine_func(HangForever())
     decorator = retry(try_max=2,
                       try_timeout=0.1,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine, loop=loop)
     done, pending = loop.run_until_complete(
         asyncio.wait([decorated_func()], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(
         isinstance(done.pop().exception().__cause__, asyncio.TimeoutError))
示例#13
0
 def testSucceedNeverReraise(self):
     loop = global_event_loop()
     func = SucceedNever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(reraise=True,
                       try_max=4,
                       try_timeout=None,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     done, pending = loop.run_until_complete(wait([decorated_func()]))
     self.assertEqual(len(done), 1)
     self.assertTrue(isinstance(done[0].exception(), SucceedNeverException))
示例#14
0
 def testHangForever(self):
     loop = global_event_loop()
     func = HangForever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(try_max=2,
                       try_timeout=0.1,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     done, pending = loop.run_until_complete(wait([decorated_func()]))
     self.assertEqual(len(done), 1)
     self.assertTrue(isinstance(done[0].exception().__cause__,
                                TimeoutError))
示例#15
0
 def testCancelRetry(self):
     loop = global_event_loop()
     func_coroutine = self._wrap_coroutine_func(SucceedNever())
     decorator = retry(try_timeout=0.1,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine, loop=loop)
     future = decorated_func()
     loop.call_later(0.3, future.cancel)
     done, pending = loop.run_until_complete(
         asyncio.wait([future], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(done.pop().cancelled())
示例#16
0
 def testCancelRetry(self):
     loop = global_event_loop()
     func = SucceedNever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(try_timeout=0.1,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     future = decorated_func()
     loop.call_later(0.3, future.cancel)
     done, pending = loop.run_until_complete(wait([future]))
     self.assertEqual(len(done), 1)
     self.assertTrue(done[0].cancelled())
示例#17
0
 def testSucceedNeverReraise(self):
     loop = global_event_loop()
     with self._wrap_coroutine_func(SucceedNever()) as func_coroutine:
         decorator = retry(reraise=True,
                           try_max=4,
                           try_timeout=None,
                           delay_func=RandomExponentialBackoff(
                               multiplier=0.1, base=2))
         decorated_func = decorator(func_coroutine, loop=loop)
         done, pending = loop.run_until_complete(
             asyncio.wait([decorated_func()], loop=loop))
         self.assertEqual(len(done), 1)
         self.assertTrue(
             isinstance(done.pop().exception(), SucceedNeverException))
示例#18
0
 def testOverallTimeoutWithException(self):
     loop = global_event_loop()
     func_coroutine = self._wrap_coroutine_func(SucceedNever())
     decorator = retry(try_timeout=0.1,
                       overall_timeout=0.3,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine, loop=loop)
     done, pending = loop.run_until_complete(
         asyncio.wait([decorated_func()], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(
         isinstance(done.pop().exception().__cause__,
                    SucceedNeverException))
示例#19
0
 def testSucceedNever(self):
     loop = global_event_loop()._asyncio_wrapper
     func = SucceedNever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(try_max=4,
                       try_timeout=None,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     done, pending = loop.run_until_complete(
         asyncio.wait([decorated_func()], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(
         isinstance(done.pop().exception().__cause__,
                    SucceedNeverException))
示例#20
0
 def testOverallTimeoutWithTimeoutError(self):
     loop = global_event_loop()._asyncio_wrapper
     # results in TimeoutError because it hangs forever
     func = HangForever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(try_timeout=0.1,
                       overall_timeout=0.3,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     done, pending = loop.run_until_complete(
         asyncio.wait([decorated_func()], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(
         isinstance(done.pop().exception().__cause__, asyncio.TimeoutError))
示例#21
0
 def testHangForeverReraise(self):
     loop = global_event_loop()._asyncio_wrapper
     func = HangForever()
     func_coroutine = functools.partial(loop.run_in_executor, None, func)
     decorator = retry(reraise=True,
                       try_max=2,
                       try_timeout=0.1,
                       delay_func=RandomExponentialBackoff(multiplier=0.1,
                                                           base=2))
     decorated_func = decorator(func_coroutine)
     done, pending = loop.run_until_complete(
         asyncio.wait([decorated_func()], loop=loop))
     self.assertEqual(len(done), 1)
     self.assertTrue(
         isinstance(done.pop().exception(), asyncio.TimeoutError))
示例#22
0
    def _key_refresh_retry_decorator(self):
        """
        Return a retry decorator, or None if retry is disabled.

        If retry fails, the function reraises the exception raised
        by the decorated function. If retry times out and no exception
        is available to reraise, the function raises TimeoutError.
        """
        errors = []

        if self.repo.sync_openpgp_key_refresh_retry_count is None:
            return None
        try:
            retry_count = int(self.repo.sync_openpgp_key_refresh_retry_count)
        except Exception as e:
            errors.append("sync-openpgp-key-refresh-retry-count: {}".format(e))
        else:
            if retry_count <= 0:
                return None

        if self.repo.sync_openpgp_key_refresh_retry_overall_timeout is None:
            retry_overall_timeout = None
        else:
            try:
                retry_overall_timeout = float(
                    self.repo.sync_openpgp_key_refresh_retry_overall_timeout)
            except Exception as e:
                errors.append(
                    "sync-openpgp-key-refresh-retry-overall-timeout: {}".
                    format(e))
            else:
                if retry_overall_timeout < 0:
                    errors.append(
                        "sync-openpgp-key-refresh-retry-overall-timeout: "
                        "value must be greater than or equal to zero: {}".
                        format(retry_overall_timeout))
                elif retry_overall_timeout == 0:
                    retry_overall_timeout = None

        if self.repo.sync_openpgp_key_refresh_retry_delay_mult is None:
            retry_delay_mult = None
        else:
            try:
                retry_delay_mult = float(
                    self.repo.sync_openpgp_key_refresh_retry_delay_mult)
            except Exception as e:
                errors.append(
                    "sync-openpgp-key-refresh-retry-delay-mult: {}".format(e))
            else:
                if retry_delay_mult <= 0:
                    errors.append("sync-openpgp-key-refresh-retry-mult: "
                                  "value must be greater than zero: {}".format(
                                      retry_delay_mult))

        if self.repo.sync_openpgp_key_refresh_retry_delay_exp_base is None:
            retry_delay_exp_base = None
        else:
            try:
                retry_delay_exp_base = float(
                    self.repo.sync_openpgp_key_refresh_retry_delay_exp_base)
            except Exception as e:
                errors.append(
                    "sync-openpgp-key-refresh-retry-delay-exp: {}".format(e))
            else:
                if retry_delay_exp_base <= 0:
                    errors.append("sync-openpgp-key-refresh-retry-delay-exp: "
                                  "value must be greater than zero: {}".format(
                                      retry_delay_mult))

        if errors:
            lines = []
            lines.append("")
            lines.append("!!! Retry disabled for openpgp key refresh:")
            lines.append("")
            for msg in errors:
                lines.append("    {}".format(msg))
            lines.append("")

            for line in lines:
                writemsg_level("{}\n".format(line),
                               level=logging.ERROR,
                               noiselevel=-1)

            return None

        return retry(
            reraise=True,
            try_max=retry_count,
            overall_timeout=(retry_overall_timeout
                             if retry_overall_timeout > 0 else None),
            delay_func=RandomExponentialBackoff(
                multiplier=(1
                            if retry_delay_mult is None else retry_delay_mult),
                base=(2 if retry_delay_exp_base is None else
                      retry_delay_exp_base),
            ),
        )
示例#23
0
	def _key_refresh_retry_decorator(self):
		'''
		Return a retry decorator, or None if retry is disabled.

		If retry fails, the function reraises the exception raised
		by the decorated function. If retry times out and no exception
		is available to reraise, the function raises TimeoutError.
		'''
		errors = []

		if self.repo.sync_openpgp_key_refresh_retry_count is None:
			return None
		try:
			retry_count = int(self.repo.sync_openpgp_key_refresh_retry_count)
		except Exception as e:
			errors.append('sync-openpgp-key-refresh-retry-count: {}'.format(e))
		else:
			if retry_count <= 0:
				return None

		if self.repo.sync_openpgp_key_refresh_retry_overall_timeout is None:
			retry_overall_timeout = None
		else:
			try:
				retry_overall_timeout = float(self.repo.sync_openpgp_key_refresh_retry_overall_timeout)
			except Exception as e:
				errors.append('sync-openpgp-key-refresh-retry-overall-timeout: {}'.format(e))
			else:
				if retry_overall_timeout < 0:
					errors.append('sync-openpgp-key-refresh-retry-overall-timeout: '
						'value must be greater than or equal to zero: {}'.format(retry_overall_timeout))
				elif retry_overall_timeout == 0:
					retry_overall_timeout = None

		if self.repo.sync_openpgp_key_refresh_retry_delay_mult is None:
			retry_delay_mult = None
		else:
			try:
				retry_delay_mult = float(self.repo.sync_openpgp_key_refresh_retry_delay_mult)
			except Exception as e:
				errors.append('sync-openpgp-key-refresh-retry-delay-mult: {}'.format(e))
			else:
				if retry_delay_mult <= 0:
					errors.append('sync-openpgp-key-refresh-retry-mult: '
						'value must be greater than zero: {}'.format(retry_delay_mult))

		if self.repo.sync_openpgp_key_refresh_retry_delay_exp_base is None:
			retry_delay_exp_base = None
		else:
			try:
				retry_delay_exp_base = float(self.repo.sync_openpgp_key_refresh_retry_delay_exp_base)
			except Exception as e:
				errors.append('sync-openpgp-key-refresh-retry-delay-exp: {}'.format(e))
			else:
				if retry_delay_exp_base <= 0:
					errors.append('sync-openpgp-key-refresh-retry-delay-exp: '
						'value must be greater than zero: {}'.format(retry_delay_mult))

		if errors:
			lines = []
			lines.append('')
			lines.append('!!! Retry disabled for openpgp key refresh:')
			lines.append('')
			for msg in errors:
				lines.append('    {}'.format(msg))
			lines.append('')

			for line in lines:
				writemsg_level("{}\n".format(line),
					level=logging.ERROR, noiselevel=-1)

			return None

		return retry(
			reraise=True,
			try_max=retry_count,
			overall_timeout=(retry_overall_timeout if retry_overall_timeout > 0 else None),
			delay_func=RandomExponentialBackoff(
				multiplier=(1 if retry_delay_mult is None else retry_delay_mult),
				base=(2 if retry_delay_exp_base is None else retry_delay_exp_base)))