Add durable/deferrable filters to the Airflow Registry - #70298
Draft
amoghrajesh wants to merge 3 commits into
Draft
Add durable/deferrable filters to the Airflow Registry#70298amoghrajesh wants to merge 3 commits into
amoghrajesh wants to merge 3 commits into
Conversation
amoghrajesh
requested review from
ashb,
bugraoz93,
choo121600,
ephraimbuddy,
gopidesupavan,
jason810496,
jedcunningham,
jscheffl,
kaxil,
potiuk and
vatsrahul1001
as code owners
July 23, 2026 12:31
amoghrajesh
marked this pull request as draft
July 23, 2026 12:31
ashb
reviewed
Jul 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Was generative AI tooling used to co-author this PR?
Important Note
What "durable" and "deferrable" mean in the PR: there are two different reasons an operator can survive a crash, and they work in totally different ways. "Durable" means the operator own code remembers where its job was and reconnects to it instead of starting over, and this operates using task state store in synchronous mode. "Deferrable" is running using a trigger, in asynchronous mode. The end result looks similar to a user (nothing gets redone), but one is a promise the operator has to keep and the other is just how the system already works for everyone.
What
Follow up to the merged
supports_durable_executionbadge PR (#67236). Now that we have badget support, we should also have a few filters for ease of navigation for two related-but-distinct capabilities: "durable" (anything that survives a crash without redoing work --ResumableJobMixin/manual-marker operators, or deferrable ones) and "deferrable" (the narrower, deferrable-only subset). The registry had no deferrable detection at all before this change.Current behaviour
The Registry only tracks
supports_durable_execution(ResumableJobMixinor the manual__supports_durable_executionmarker coming in PR: #70291). Deferrable operators -- a much more common capability across most cloud providers -- have no signal anywhere in the pipeline, and there's no way to filter a provider's module list by either capability.Proposed change
supports_deferrable(cls)added todev/registry/extract_parameters.py-- checks for adeferrableconstructor parameter, reusing the existingget_params_from_class()machinery already used forparameters.json(no new introspection needed).supports_deferrable: bool = Falseadded toModuleContract, wired intomake_entry()alongsidesupports_durable_execution(14 fields total, kept as an independent signal, not merged into the existing one).Changes of Note
supports_durable_execution OR supports_deferrable-- checking it shows every deferrable operator plus everyResumableJobMixin/manual-marker operator, even ones that aren't deferrable. "Deferrable only" issupports_deferrablealone, never OR'd. This means an operator that is both durable and deferrable appears under both filters -- verified this is intentional and not confusing in practice, since the two independent badges on the card explain why.⊆durable, never the reverse) visible at the point of clicking, rather than relying on a tooltip or a caption someone could miss.is_deferrableinheriting a parent's__init__unmodified still counts as deferrable (unlike thesupports_durable_executionmanual-marker case, which deliberately does not propagate to subclasses) -- inheriting an unmodified constructor is a real functional guarantee the parameter still works, whereas inheriting a durable-execution claim says nothing about whether an overriddenexecute()still preserves it.Testing
Built breeze to extract the provider data using:
breeze registry extract-dataBuilt the actual Eleventy site against this real data and confirmed in the rendered HTML: both badges appear on the right operator cards (e.g. Databricks' page shows both a "Durable" and "Deferrable" badge on
DatabricksRunNowOperator), both filter checkboxes render with the intended labels, and thedata-durable/data-deferrableattributes are correctly populated per the OR/non-OR logic on every module checked.For current changes, this is the behaviour:
DatabricksSubmitRunOperatorandDatabricksRunNowOperatorare both durable and deferrable.DatabricksNotebookOperator,DatabricksSQLStatementsOperator,DatabricksTaskBaseOperator,DatabricksTaskOperator, andDatabricksSQLStatementsSensorare deferrable only. The rest of the provider's operators/hooks/sensors are neither.SparkSubmitOperatoris durable but not deferrable (nodeferrableparam) -- this is the single durable-only case across the entire registry.BigQueryInsertJobOperatoris both durable and deferrable, same pattern as Databricks.RedshiftDataOperatoris both durable and deferrable.SnowflakeSqlApiOperatoris both durable and deferrable.Across the full dataset: 1779 modules total, 6 durable, 217 deferrable, 5 with both (the five listed above).
Some screenshots:
In this image, "Durable (includes deferrable)" is selected, and you can see both durable + deferrable (BigQueryInsertJobOperator) and just deferrable ones selected
"Deferrable only selection":
Operator like snowflake has only one operator with both deferrable and durable property, so its here:
Spark is one of few operators with only "durable", and no deferrable option:
What's next
Interactive click-through verification (actually toggling the checkboxes in a running browser to confirm
filterModules()behaves correctly) hasn't been done -- only the generated HTML/data have been checked, not runtime JS behavior. Registry-wide (cross-provider) discovery -- "which are all the durable/deferrable operators across the whole registry," via a Pagefind search filter facet -- was discussed and deliberately deferred to a separate follow-up.{pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.