Пример #1
0
 def mark_as_failure(self,
                     task_id,
                     exc,
                     traceback=None,
                     request=None,
                     store_result=True,
                     call_errbacks=True,
                     state=states.FAILURE):
     """Mark task as executed with failure."""
     if store_result:
         self.store_result(task_id,
                           exc,
                           state,
                           traceback=traceback,
                           request=request)
     if request:
         # This task may be part of a chord
         if request.chord:
             self.on_chord_part_return(request, state, exc)
         # It might also have chained tasks which need to be propagated to,
         # this is most likely to be exclusive with being a direct part of a
         # chord but we'll handle both cases separately.
         #
         # The `chain_data` try block here is a bit tortured since we might
         # have non-iterable objects here in tests and it's easier this way.
         try:
             chain_data = iter(request.chain)
         except (AttributeError, TypeError):
             chain_data = tuple()
         for chain_elem in chain_data:
             chain_elem_opts = chain_elem['options']
             # If the state should be propagated, we'll do so for all
             # elements of the chain. This is only truly important so
             # that the last chain element which controls completion of
             # the chain itself is marked as completed to avoid stalls.
             if self.store_result and state in states.PROPAGATE_STATES:
                 try:
                     chained_task_id = chain_elem_opts['task_id']
                 except KeyError:
                     pass
                 else:
                     self.store_result(chained_task_id,
                                       exc,
                                       state,
                                       traceback=traceback,
                                       request=chain_elem)
             # If the chain element is a member of a chord, we also need
             # to call `on_chord_part_return()` as well to avoid stalls.
             if 'chord' in chain_elem_opts:
                 failed_ctx = Context(chain_elem)
                 failed_ctx.update(failed_ctx.options)
                 failed_ctx.id = failed_ctx.options['task_id']
                 failed_ctx.group = failed_ctx.options['group_id']
                 self.on_chord_part_return(failed_ctx, state, exc)
         # And finally we'll fire any errbacks
         if call_errbacks and request.errbacks:
             self._call_task_errbacks(request, exc, traceback)
Пример #2
0
 def mark_as_failure(self, task_id, exc,
                     traceback=None, request=None,
                     store_result=True, call_errbacks=True,
                     state=states.FAILURE):
     """Mark task as executed with failure."""
     if store_result:
         self.store_result(task_id, exc, state,
                           traceback=traceback, request=request)
     if request:
         # This task may be part of a chord
         if request.chord:
             self.on_chord_part_return(request, state, exc)
         # It might also have chained tasks which need to be propagated to,
         # this is most likely to be exclusive with being a direct part of a
         # chord but we'll handle both cases separately.
         #
         # The `chain_data` try block here is a bit tortured since we might
         # have non-iterable objects here in tests and it's easier this way.
         try:
             chain_data = iter(request.chain)
         except (AttributeError, TypeError):
             chain_data = tuple()
         for chain_elem in chain_data:
             # Reconstruct a `Context` object for the chained task which has
             # enough information to for backends to work with
             chain_elem_ctx = Context(chain_elem)
             chain_elem_ctx.update(chain_elem_ctx.options)
             chain_elem_ctx.id = chain_elem_ctx.options.get('task_id')
             chain_elem_ctx.group = chain_elem_ctx.options.get('group_id')
             # If the state should be propagated, we'll do so for all
             # elements of the chain. This is only truly important so
             # that the last chain element which controls completion of
             # the chain itself is marked as completed to avoid stalls.
             #
             # Some chained elements may be complex signatures and have no
             # task ID of their own, so we skip them hoping that not
             # descending through them is OK. If the last chain element is
             # complex, we assume it must have been uplifted to a chord by
             # the canvas code and therefore the condition below will ensure
             # that we mark something as being complete as avoid stalling.
             if (
                 store_result and state in states.PROPAGATE_STATES and
                 chain_elem_ctx.task_id is not None
             ):
                 self.store_result(
                     chain_elem_ctx.task_id, exc, state,
                     traceback=traceback, request=chain_elem_ctx,
                 )
             # If the chain element is a member of a chord, we also need
             # to call `on_chord_part_return()` as well to avoid stalls.
             if 'chord' in chain_elem_ctx.options:
                 self.on_chord_part_return(chain_elem_ctx, state, exc)
         # And finally we'll fire any errbacks
         if call_errbacks and request.errbacks:
             self._call_task_errbacks(request, exc, traceback)