Example #1
0
class OrderRetryTask(base.BarbicanObject, base.BarbicanPersistentObject,
                     object_base.VersionedObjectDictCompat):
    fields = {
        'id': fields.StringField(default=utils.generate_uuid()),
        'order_id': fields.StringField(),
        'retry_task': fields.StringField(),
        'retry_at': fields.DateTimeField(nullable=True, default=None),
        'retry_args': fields.JsonField(),
        'retry_kwargs': fields.JsonField(),
        'retry_count': fields.IntegerField(default=0)
    }

    db_model = models.OrderRetryTask
    db_repo = repos.get_order_retry_tasks_repository()

    @classmethod
    def get_by_create_date(cls, only_at_or_before_this_date=None,
                           offset_arg=None, limit_arg=None,
                           suppress_exception=False,
                           session=None):
        entities_db, offset, limit, total = cls.db_repo.get_by_create_date(
            only_at_or_before_this_date, offset_arg, limit_arg,
            suppress_exception, session)
        entities = [cls()._from_db_object(entity_db)
                    for entity_db in entities_db]
        return entities, offset, limit, total
Example #2
0
def create_order_retry(order=None, retry_task="", retry_args=[],
                       retry_kwargs={}, retry_at=None, session=None):
    order_retry = models.OrderRetryTask()
    order_retry.retry_task = retry_task
    order_retry.retry_args = retry_args
    order_retry.retry_kwargs = retry_kwargs
    if not retry_at:
        order_retry.retry_at = datetime.datetime.utcnow()
    order_retry.order_id = order.id
    order_retry_task_repo = repositories.get_order_retry_tasks_repository()
    order_retry_task_repo.create_from(order_retry, session)
    return order_retry
Example #3
0
def schedule_order_retry_tasks(
        invoked_task, retry_result, context, *args, **kwargs):
    """Schedules an Order-related task for retry.

    :param invoked_task: The RPC method that was just invoked.
    :param retry_result: A :class:`FollowOnProcessingStatusDTO` if follow-on
                         processing (such as retrying this or another task) is
                         required, otherwise None indicates no such follow-on
                         processing is required.
    :param context: Queue context, not used.
    :param order_id: ID of the Order entity the task to retry is for.
    :param args: List of arguments passed in to the just-invoked task.
    :param kwargs: Dict of arguments passed in to the just-invoked task.
    :return: Returns the RPC task method scheduled for a retry, None if no RPC
             task was scheduled.
    """

    retry_rpc_method = None
    order_id = kwargs.get('order_id')

    if not retry_result or not order_id:
        pass

    elif common.RetryTasks.INVOKE_SAME_TASK == retry_result.retry_task:
        if invoked_task:
            retry_rpc_method = getattr(
                invoked_task, '__name__', None)

    else:
        retry_rpc_method = MAP_RETRY_TASKS.get(retry_result.retry_task)

    if retry_rpc_method:
        LOG.debug(
            'Scheduling RPC method for retry: {0}'.format(retry_rpc_method))

        date_to_retry_at = datetime.datetime.utcnow() + datetime.timedelta(
            milliseconds=retry_result.retry_msec)

        retry_model = models.OrderRetryTask()
        retry_model.order_id = order_id
        retry_model.retry_task = retry_rpc_method
        retry_model.retry_at = date_to_retry_at
        retry_model.retry_args = args
        retry_model.retry_kwargs = kwargs
        retry_model.retry_count = 0

        retry_repo = repositories.get_order_retry_tasks_repository()
        retry_repo.create_from(retry_model)

    return retry_rpc_method
Example #4
0
def schedule_order_retry_tasks(invoked_task, retry_result, context, *args,
                               **kwargs):
    """Schedules an Order-related task for retry.

    :param invoked_task: The RPC method that was just invoked.
    :param retry_result: A :class:`FollowOnProcessingStatusDTO` if follow-on
                         processing (such as retrying this or another task) is
                         required, otherwise None indicates no such follow-on
                         processing is required.
    :param context: Queue context, not used.
    :param order_id: ID of the Order entity the task to retry is for.
    :param args: List of arguments passed in to the just-invoked task.
    :param kwargs: Dict of arguments passed in to the just-invoked task.
    :return: Returns the RPC task method scheduled for a retry, None if no RPC
             task was scheduled.
    """

    retry_rpc_method = None
    order_id = kwargs.get('order_id')

    if not retry_result or not order_id:
        pass

    elif common.RetryTasks.INVOKE_SAME_TASK == retry_result.retry_task:
        if invoked_task:
            retry_rpc_method = find_function_name(invoked_task)

    else:
        retry_rpc_method = MAP_RETRY_TASKS.get(retry_result.retry_task)

    if retry_rpc_method:
        LOG.debug(
            'Scheduling RPC method for retry: {0}'.format(retry_rpc_method))

        date_to_retry_at = datetime.datetime.utcnow() + datetime.timedelta(
            milliseconds=retry_result.retry_msec)

        retry_model = models.OrderRetryTask()
        retry_model.order_id = order_id
        retry_model.retry_task = retry_rpc_method
        retry_model.retry_at = date_to_retry_at
        retry_model.retry_args = args
        retry_model.retry_kwargs = kwargs
        retry_model.retry_count = 0

        retry_repo = repositories.get_order_retry_tasks_repository()
        retry_repo.create_from(retry_model)

    return retry_rpc_method
Example #5
0
def create_order_retry(order=None,
                       retry_task="",
                       retry_args=[],
                       retry_kwargs={},
                       retry_at=None,
                       session=None):
    order_retry = models.OrderRetryTask()
    order_retry.retry_task = retry_task
    order_retry.retry_args = retry_args
    order_retry.retry_kwargs = retry_kwargs
    if not retry_at:
        order_retry.retry_at = datetime.datetime.utcnow()
    order_retry.order_id = order.id
    order_retry_task_repo = repositories.get_order_retry_tasks_repository()
    order_retry_task_repo.create_from(order_retry, session)
    return order_retry
Example #6
0
    def __init__(self, queue_resource=None):
        super(PeriodicServer, self).__init__()

        # Setting up db engine to avoid lazy initialization
        repositories.setup_database_engine_and_factory()

        # Connect to the worker queue, to send retry RPC tasks to it later.
        self.queue = queue_resource or async_client.TaskClient()

        # Start the task retry periodic scheduler process up.
        periodic_interval = (
            CONF.retry_scheduler.periodic_interval_max_seconds)
        self.tg.add_dynamic_timer(
            self._check_retry_tasks,
            initial_delay=CONF.retry_scheduler.initial_delay_seconds,
            periodic_interval_max=periodic_interval)

        self.order_retry_repo = repositories.get_order_retry_tasks_repository()
Example #7
0
    def __init__(self, queue_resource=None):
        super(PeriodicServer, self).__init__()

        # Setting up db engine to avoid lazy initialization
        repositories.setup_database_engine_and_factory()

        # Connect to the worker queue, to send retry RPC tasks to it later.
        self.queue = queue_resource or async_client.TaskClient()

        # Start the task retry periodic scheduler process up.
        periodic_interval = (
            CONF.retry_scheduler.periodic_interval_max_seconds
        )
        self.tg.add_dynamic_timer(
            self._check_retry_tasks,
            initial_delay=CONF.retry_scheduler.initial_delay_seconds,
            periodic_interval_max=periodic_interval)

        self.order_retry_repo = repositories.get_order_retry_tasks_repository()
Example #8
0
    def _create_retry_task(self):
        # Add one retry task:
        task = 'test_task'
        args = ('foo', 'bar')
        kwargs = {'k_foo': 1, 'k_bar': 2}

        order = database_utils.create_order()

        retry = models.OrderRetryTask()
        retry.order_id = order.id
        retry.retry_at = datetime.datetime.utcnow()
        retry.retry_task = task
        retry.retry_args = args
        retry.retry_kwargs = kwargs

        retry_repo = repositories.get_order_retry_tasks_repository()
        retry_repo.create_from(retry)

        database_utils.get_session().commit()

        return args, kwargs, retry_repo
Example #9
0
    def _create_retry_task(self):
        # Add one retry task:
        task = 'test_task'
        args = ('foo', 'bar')
        kwargs = {'k_foo': 1, 'k_bar': 2}

        order = database_utils.create_order()

        retry = models.OrderRetryTask()
        retry.order_id = order.id
        retry.retry_at = datetime.datetime.utcnow()
        retry.retry_task = task
        retry.retry_args = args
        retry.retry_kwargs = kwargs

        retry_repo = repositories.get_order_retry_tasks_repository()
        retry_repo.create_from(retry)

        database_utils.get_session().commit()

        return args, kwargs, retry_repo