Thanks Amogh for adding this!

In deed this was missing for a long time!

You did not tell about but we can assume plan is to release this with Airflow 3.3.0?

On 23.04.26 18:03, Aritra Basu wrote:
This is quite useful! Nice!
Thanks and Regards,
Aritra Basu


On Thu, Apr 23, 2026 at 9:17 PM Amogh Desai <[email protected]> wrote:

Hi Again,

Created an issue tracking the migration of provider triggers from the old
CancelledError
pattern to the new on_kill() hook:
https://github.com/apache/airflow/issues/65733

Three triggers need updating — Dataproc, EMR Serverless, and Kubernetes.
Each is a
contained change in a single file. Good first contribution if you want to
get familiar with the
triggerer.

Drop a comment on the issue if you want to pick one up.

Thanks & Regards,
Amogh Desai


On Thu, Apr 23, 2026 at 7:40 PM Kaxil Naik <[email protected]> wrote:

Finally, this has been troubling users since Triggerer was added.

On Thu, 23 Apr 2026 at 14:59, Elad Kalif <[email protected]> wrote:

This is great! well done!

On Thu, Apr 23, 2026 at 4:42 PM Amogh Desai <[email protected]>
wrote:
Hey All,

Wanted to call out a new hook we added to BaseTrigger — `on_kill()`,
PR:
https://github.com/apache/airflow/pull/65590.

*Why does it exist?*

If your trigger polls an external job (BigQuery, Databricks,
Dataproc,
etc.), there was no clean way to cancel that job when
a user kills the deferred task, either by marking it as success,
failure,
or clearing it. `cleanup()` wasn't the right place —
it fires on every trigger exit including triggerer restarts and
rolling
deploys, so putting cancellation there would kill in-flight
work on every redeploy.

`on_kill()` solves this. It only fires when a user explicitly acts on
the
task. Not on restart, not on redistribution.

*How it works*

The triggerer passes a private sentinel via
`asyncio.Task.cancel(msg)`
to
distinguish user kills from other exits — no DB
round-trip needed. There's a configurable timeout (*[triggerer]
on_kill_timeout, default 30s*) so a slow external API call
cannot block the triggerer.

Databricks is updated as a reference:
https://github.com/apache/airflow/pull/65672

Both `DatabricksExecutionTrigger` and
`DatabricksSQLStatementExecutionTrigger` now implement it.

*Who benefits from this?*

If you are someone building or maintaining a trigger that manages
external
work, you can consider adopting to this hook
and implementing it for your trigger class, Airflow 3.3 will launch
this.
No compat guard is needed, Airflow < 3.2 the method just never gets
called.
*Next steps*

I pulled some data from the repo and these are candidates for this
migration.

Google Provider: DataprocSubmitTrigger and
DataprocSubmitJobDirectTrigger
in the google provider. Currently catches
CancelledError in run() and calls hook.cancel_job(job_id) after
checking
safe_to_cancel().

Amazon Provider: EmrServerlessStartJobTrigger. Same pattern.
CancelledError
handler with safe_to_cancel() calling
hook.conn.cancel_job_run(). Straightforward migration.

CNCF provider: KubernetesPodTrigger in cncf/kubernetes. Has an
on_kill_action parameter controlling whether to
delete/patch the pod. The cancellation logic lives in a
CancelledError
handler. Move it to on_kill().

Happy to help with reviews for these.


Thanks & Regards,
Amogh Desai


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to