You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "amoghrajesh (via GitHub)" <gi...@apache.org> on 2025/07/09 07:12:46 UTC
Re: [PR] Run Task failure callbacks on DAG Processor when task is externally killed [airflow]
amoghrajesh commented on code in PR #53058:
URL: https://github.com/apache/airflow/pull/53058#discussion_r2194231172
##########
airflow-core/src/airflow/dag_processing/processor.py:
##########
@@ -238,6 +238,66 @@ def _execute_dag_callbacks(dagbag: DagBag, request: DagCallbackRequest, log: Fil
Stats.incr("dag.callback_exceptions", tags={"dag_id": request.dag_id})
+def _execute_task_callbacks(dagbag: DagBag, request: TaskCallbackRequest, log: FilteringBoundLogger) -> None:
+ if not request.is_failure_callback:
+ log.warning(
+ "Task callback requested but is not a failure callback",
+ dag_id=request.ti.dag_id,
+ task_id=request.ti.task_id,
+ run_id=request.ti.run_id,
+ )
+ return
+
+ dag = dagbag.dags[request.ti.dag_id]
+ task = dag.get_task(request.ti.task_id)
+
+ if request.task_callback_type is TaskInstanceState.UP_FOR_RETRY:
+ callbacks = task.on_retry_callback
+ else:
+ callbacks = task.on_failure_callback
+
+ if not callbacks:
+ log.warning(
+ "Callback requested but no callback found",
+ dag_id=request.ti.dag_id,
+ task_id=request.ti.task_id,
+ run_id=request.ti.run_id,
+ )
+ return
+
+ callbacks = callbacks if isinstance(callbacks, Sequence) else [callbacks]
+ ctx_from_server = request.context_from_server
+
+ if ctx_from_server is not None:
+ rti = RuntimeTaskInstance.model_construct(
Review Comment:
```suggestion
runtime_ti = RuntimeTaskInstance.model_construct(
```
nit
##########
task-sdk/src/airflow/sdk/api/datamodels/_generated.py:
##########
@@ -519,7 +519,7 @@ class TIRunContext(BaseModel):
next_method: Annotated[str | None, Field(title="Next Method")] = None
next_kwargs: Annotated[dict[str, Any] | str | None, Field(title="Next Kwargs")] = None
xcom_keys_to_clear: Annotated[list[str] | None, Field(title="Xcom Keys To Clear")] = None
- should_retry: Annotated[bool, Field(title="Should Retry")]
+ should_retry: Annotated[bool | None, Field(title="Should Retry")] = False
Review Comment:
Hmm, this doesn't sound right, its always a boolean right?
##########
airflow-core/src/airflow/dag_processing/processor.py:
##########
@@ -238,6 +238,66 @@ def _execute_dag_callbacks(dagbag: DagBag, request: DagCallbackRequest, log: Fil
Stats.incr("dag.callback_exceptions", tags={"dag_id": request.dag_id})
+def _execute_task_callbacks(dagbag: DagBag, request: TaskCallbackRequest, log: FilteringBoundLogger) -> None:
+ if not request.is_failure_callback:
+ log.warning(
+ "Task callback requested but is not a failure callback",
+ dag_id=request.ti.dag_id,
+ task_id=request.ti.task_id,
+ run_id=request.ti.run_id,
+ )
+ return
+
+ dag = dagbag.dags[request.ti.dag_id]
+ task = dag.get_task(request.ti.task_id)
+
+ if request.task_callback_type is TaskInstanceState.UP_FOR_RETRY:
+ callbacks = task.on_retry_callback
+ else:
+ callbacks = task.on_failure_callback
+
+ if not callbacks:
+ log.warning(
+ "Callback requested but no callback found",
+ dag_id=request.ti.dag_id,
+ task_id=request.ti.task_id,
+ run_id=request.ti.run_id,
+ )
+ return
+
+ callbacks = callbacks if isinstance(callbacks, Sequence) else [callbacks]
+ ctx_from_server = request.context_from_server
+
+ if ctx_from_server is not None:
+ rti = RuntimeTaskInstance.model_construct(
+ **request.ti.model_dump(exclude_unset=True),
+ task=task,
+ _ti_context_from_server=ctx_from_server,
+ max_tries=ctx_from_server.max_tries,
+ )
+ else:
+ rti = RuntimeTaskInstance.model_construct(
+ **request.ti.model_dump(exclude_unset=True),
+ task=task,
+ )
+ context = rti.get_template_context()
+
+ def get_callback_representation(callback):
+ with contextlib.suppress(AttributeError):
+ return callback.__name__
+ with contextlib.suppress(AttributeError):
+ return callback.__class__.__name__
+ return callback
+
+ for idx, callback in enumerate(callbacks):
+ callback_repr = get_callback_representation(callback)
+ log.info("Executing Task callback at index %d: %s", idx, callback_repr)
Review Comment:
```suggestion
log.info("Executing task callback #%d: %s", idx, callback_repr)
```
nit
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org