Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
431 commits
Select commit Hold shift + click to select a range
c4c4562
Add revoke_task implementation to EdgeExecutor for task queued timeou…
dheerajturaga Oct 1, 2025
df459b1
Fix SQLA Mapped datetime imports in models (#56264)
amoghrajesh Oct 1, 2025
c7d9e44
Remove timeout parameter from the dataproc_metastore sys test (#56247)
VladaZakharova Oct 1, 2025
28d3705
Fix wrong import of `AIRFLOW_V_3_0_PLUS` in `AwsLambdaExecutor` (#56280)
o-nikolas Oct 1, 2025
75f2fd8
Add async support for Amazon SQS Notifier (#56159)
ferruzzi Oct 1, 2025
1b490da
Prepare fab and amazon providers to release (September 2025) (#56241)
eladkal Oct 1, 2025
6d0f6e5
UI: Add Expand/Collapse all to XComs page (#56083)
KatalKavya96 Oct 1, 2025
5755343
Only import OpenLineage plugin listeners/hooks if plugin is enabled (…
jedcunningham Oct 1, 2025
c355832
Fix ValueError in def operators in google provider (#55821)
VladaZakharova Oct 1, 2025
165a763
Refactor: deprecate wait_policy in EmrCreateJobFlowOperator in favor …
laksh-krishna-sharma Oct 1, 2025
c3aeba3
UI: Fix Grid for cleared runs when tasks were removed (#56085)
ephraimbuddy Oct 1, 2025
0345626
Revert "Update all models to use `sqlalchemy` 2 annotations (#55954)"…
vincbeck Oct 1, 2025
e325ea9
Fix multi-line drag selection in task log view (#56238)
Brunda10 Oct 1, 2025
945f6cd
fix(i18n): Add translation keys and remove fallback (#56274)
RoyLee1224 Oct 1, 2025
e5bfb10
Add a prototype Edge Worker client to the Go SDK (#56290)
ashb Oct 1, 2025
ce3eebf
Enable PT011 rule to prvoider tests (#56277)
xchwan Oct 1, 2025
c1a21cf
Default checkPendingRuns to false (#56307)
bbovenzi Oct 1, 2025
b030019
[AWS System Tests] Add task retries to deletion of EKS resources (#56…
ramitkataria Oct 1, 2025
c126f91
Fix FAB provider name in auth manager section of release notes (#56301)
jedcunningham Oct 1, 2025
8d928c6
nit: Bump required OL client for Openlineage provider (#56302)
kacpermuda Oct 2, 2025
11ea58a
Fix config section in warning about db scheme (#56316)
jedcunningham Oct 2, 2025
11b2810
Enable PT011 rule to prvoider tests (#56320)
xchwan Oct 2, 2025
c3432d9
Use TI duration from db instead of UI calculated (#56310)
bbovenzi Oct 2, 2025
c2ce00d
Avoid using rem for icons for safari compatibility (#56304)
bbovenzi Oct 2, 2025
5d9e2c5
Update recent runs bar chart and improve responsiveness (#56314)
bbovenzi Oct 2, 2025
cf03ed7
attempt to update 3.0.1 release notes for serialization interface cha…
sjyangkevin Oct 2, 2025
a71927f
Expand and collapse group component (#56293)
pierrejeambrun Oct 2, 2025
5ccacac
Enable PT011 rule to prvoider tests (#56237)
xchwan Oct 2, 2025
719cd0c
Add if_not_exists to index creation in migrations (#56328)
meher1993 Oct 2, 2025
11afbbb
Fix dataflow java system test + link (#56286)
VladaZakharova Oct 2, 2025
b59cedd
Bump ruff to 0.13.3 and prek to 0.2.3 (#56355)
amoghrajesh Oct 3, 2025
49ca3f2
fix: allow mapped tasks to accept zero-length inputs on rerun (#56162)
kevinhongzl Oct 3, 2025
6bace3d
Chart gitsync vars (#56245)
ido177 Oct 3, 2025
9bbb34f
Update provider's metadata (#56357)
potiuk Oct 3, 2025
b99e0ac
Fix install_java.sh (#56211)
VladaZakharova Oct 3, 2025
d27513c
Add new PL translations. (#56359)
potiuk Oct 3, 2025
d8c1525
feature: Add OpenLineage support for CloudDataTransferServiceS3ToGCSO…
pawelgrochowicz Oct 3, 2025
3762f30
feature: Add OpenLineage support for SpannerQueryDatabaseInstanceOper…
pawelgrochowicz Oct 3, 2025
c086f77
Add a section in contributors guide about working with dags (#56362)
amoghrajesh Oct 3, 2025
d05620a
Update _helpers.yaml to support custom apiServerConfigConfigMapName (…
scali Oct 3, 2025
baafd38
fix(livy): replace connection type (#55984)
javierherrer Oct 3, 2025
afa8c32
Reapply "update AzureBaseHook to return credentials that supports get…
karunpoudel Oct 3, 2025
f384b1a
Restrict universal-pathlib 0.3.0 (#56370)
gopidesupavan Oct 3, 2025
402e177
Prefer BigQueryInsertJobOperator's project_id over hook's project_id …
BasPH Oct 4, 2025
1f8324d
fix: modify min width for task names (#56378)
RoyLee1224 Oct 4, 2025
ca037ea
Prepare fab provider rc2 to release (October 2025) (#56384)
eladkal Oct 4, 2025
793c3ce
Fix providers release manager docs (#56385)
eladkal Oct 4, 2025
9eb8b1a
update breeze Option B quick setup (#56333)
andwct Oct 4, 2025
4672819
Add msgraphfs provider (#55454)
bolkedebruin Oct 4, 2025
b107cdf
include task instance id in log printed by supervisor (#56383)
rawwar Oct 4, 2025
6ee540f
replace start-airflow with stop_airflow (#56390)
anujarora0502 Oct 5, 2025
f4a1ae8
Make Dag Run ID visible in Dag Header Card (#56392)
jscheffl Oct 5, 2025
413e82b
Use Task Display Name in Grid if existing (#56393)
jscheffl Oct 5, 2025
de3bdd4
fix: show appropriate time units in grid view (#56403)
RoyLee1224 Oct 5, 2025
a47cb1d
Build correct SQLAlchemy URI in TeradataHook (#56305)
sc250072 Oct 5, 2025
10f1ecc
Close German translation gaps for full UI translation 2025-10-05 (#56…
jscheffl Oct 5, 2025
e0286c6
Limit astroid to < 4 to fix broken docs builds (#56419)
amoghrajesh Oct 6, 2025
106bc00
Werkzeug Version Check (#56398)
utieyin Oct 6, 2025
4eb5604
AIP-82: implement Google Pub/Sub message queue provider (#54494)
dejii Oct 6, 2025
af5350d
Revert "AIP-82: implement Google Pub/Sub message queue provider (#544…
jason810496 Oct 6, 2025
5790469
Fix scheduler crash with email notifications (#56429)
kaxil Oct 6, 2025
6d67f71
Add uvicorn to spelling ignore list (#56441)
kaxil Oct 6, 2025
88e3c7f
Bump uv version to 0.8.24 and prek to 0.2.4 (#56464)
amoghrajesh Oct 7, 2025
cac1fc8
Bump uv version to 0.9.0 and ruff to 0.14.0 (#56467)
amoghrajesh Oct 8, 2025
e69578f
Fix Edge3 provider navigation with webserver base_url configuration (…
dheerajturaga Oct 8, 2025
0a6bf72
Emit log stream stopped warning as ndjson (#56474)
ianbuss Oct 8, 2025
fac405b
feat: make clipboard hover (#56382)
RoyLee1224 Oct 8, 2025
8fa833b
Allow sub-pages in React UI plugins (#56413)
jscheffl Oct 8, 2025
b4a8564
56058: Validating latestRun before accessing its properties (#56303)
viveknanda Oct 8, 2025
98ad262
Fix broken main after pydantic 2.12.0 (#56483)
jscheffl Oct 8, 2025
304bd73
Simple sending of return value to XCom (#56481)
ashb Oct 9, 2025
a97ac70
feature: Add Open Lineage support for CloudDataFusionStartPipelineOpe…
pawelgrochowicz Oct 9, 2025
8e4c230
Add use_rest_api parameter for CloudComposerDAGRunSensor for pulling …
MaksYermak Oct 9, 2025
2d0d3c9
Added Vrahad Analaytics to the list of companies using Apache Airflow…
varun-bhardwaj-sde Oct 9, 2025
5136f1f
Bump python 3.9 to 3.9.23 and 3.12 to 3.12.12 (#56505)
amoghrajesh Oct 9, 2025
b744cb9
Add is_favorite to ui dags list (#56341)
bbovenzi Oct 9, 2025
1435106
Use Task Display Name in Graph if existing (#56455)
jscheffl Oct 9, 2025
a7d104d
Add MSCI to company list (#56518)
macdub Oct 9, 2025
b3626d7
adding Boeing to inthewild.md (#56515)
twk123 Oct 9, 2025
2007a63
fixed the bug report template dropdown option list (#56519)
Sagar1711 Oct 9, 2025
47a9e5c
docs: adding usafacts to in the wild doc (#56520)
jakepage11 Oct 9, 2025
7cda2cc
Bump uv version from 0.9.0 to 0.9.1 (#56512)
bugraoz93 Oct 9, 2025
cfb3302
Fix use of DeprecationWarning in celeray provider to AirflowProviderD…
krupakar010 Oct 9, 2025
07fae28
Add rancher-desktop to PREFERRED_CONTEXTS in docker_command_utils (#5…
sage-ingle-ck Oct 10, 2025
2219887
Removing `amoghrajesh` from older org (#56524)
amoghrajesh Oct 10, 2025
09e4f05
Update Snowflake docs with breaking change (#56516)
awiede Oct 10, 2025
a692651
Fixed typos in governance and rules file (#56521)
rj-pawar Oct 10, 2025
4386b30
Add Intuit as a company using Airflow (#56517)
nguy4130 Oct 10, 2025
899a092
Fix openlineage dag state event emit on timed out dag (#56542)
antonlin1 Oct 10, 2025
aa84fdb
add `Datadog` as company using airflow (#56546)
antonlin1 Oct 10, 2025
1ddf331
fix a typo in INTHEWILD.md file (#56547)
hussein-awala Oct 10, 2025
fb01aa5
refactor: Removed changes related to lazy task expansion
dabla Oct 11, 2025
6d7dcfa
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Oct 12, 2025
e3c5d89
refactor: Fixed ident in _get_ready_tis of DagRun model
dabla Oct 13, 2025
d3fe05c
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Oct 29, 2025
595a561
refactor: Removed obsolete DeferredIterable
dabla Oct 13, 2025
1cf8e70
refactor: Reformatted DagRun
dabla Oct 29, 2025
e3311c8
refactor: No need to add task instance id to empty_ti_ids as when con…
dabla Oct 29, 2025
8c7128f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 4, 2025
91140fe
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 5, 2025
161cf2b
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 5, 2025
d8b1f9a
fix: Fixed some errors and aligned code with main
dabla Nov 5, 2025
79dea0d
refactor: Removed commented code from queues module
dabla Nov 5, 2025
ae7f414
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 5, 2025
f4ff81c
refactor: Aligned code with main even more
dabla Nov 5, 2025
386823c
refactor: Reformatted TriggererJobRunner
dabla Nov 5, 2025
66e1e2d
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 5, 2025
14dd381
refactor: Removed rendering of template in TriggererJobRunner as this…
dabla Nov 6, 2025
39b415b
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 6, 2025
c9401fc
refactor: Added typing to specialized queues
dabla Nov 6, 2025
d58eb25
refactor: Changed import of MappedOperator from models to sdk
dabla Nov 6, 2025
0c07ff8
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 6, 2025
ed051f5
refactor: Added missing import of ColumnElement in DagRun
dabla Nov 6, 2025
7b5c94e
refactor: Removed duplicate get_dag_run method in DagRun
dabla Nov 6, 2025
38b8253
refactor: Moved import of MappedOperator outside TYPE CHECKING in Tas…
dabla Nov 6, 2025
0f72189
refactor: Try fixing docstrings in queues module
dabla Nov 6, 2025
2e36819
refactor: Moved import of Session out of TYPE CHECKING block in DagBag
dabla Nov 6, 2025
ac75b92
refactor: Moved import of Context into TYPE CHECKING block for Trigge…
dabla Nov 6, 2025
5105381
refactor: Try fixing typing of triggers field in TriggerRunner
dabla Nov 6, 2025
2026b30
refactor: Removed unused import of Any in queues
dabla Nov 6, 2025
785a3b5
refactor: Reformatted TriggerJobRunner
dabla Nov 6, 2025
8b00adc
refactor: Reformatted DagRun
dabla Nov 6, 2025
daec276
refactor: Reformatted TaskInstance
dabla Nov 6, 2025
5e6477e
refactor: Reformatted TaskMap
dabla Nov 6, 2025
34fb54c
refactor: Reformatted Trigger
dabla Nov 6, 2025
37e01ab
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 6, 2025
2a9442e
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 6, 2025
20da21f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 7, 2025
825ebe9
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 12, 2025
1fc314d
refactor: Fixed return type of iter method in KeyedHeadQueue
dabla Nov 7, 2025
ab4e6fb
refactor: Fixed import of MappedOperator in TaskMap
dabla Nov 7, 2025
8941c05
refactor: Reformatted Trigger
dabla Nov 7, 2025
08e5c8c
refactor: Updated imports TaskMap
dabla Nov 13, 2025
746e522
refactor: Updated imports DagRun
dabla Nov 13, 2025
1bcee1e
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 13, 2025
13df3e9
refactor: Tried fixing some mypy issues
dabla Nov 13, 2025
5eaf0f2
refactor: Value typevar should be bound to tuple in queues module
dabla Nov 13, 2025
4a6145c
refactor: Changed typing of failed_triggers
dabla Nov 13, 2025
fcdb878
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 13, 2025
3dc518f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 13, 2025
f119478
refactor: Reformatted queues and triggerer_job_runner
dabla Nov 13, 2025
60f749c
refactor: Reformatted trigger
dabla Nov 13, 2025
012aa21
refactor: Fixed timeout_after in run_trigger method of TriggererJobRu…
dabla Nov 13, 2025
db5375d
refactor: Added trigger in mocked trigger when testing TriggerRunner
dabla Nov 14, 2025
0f3c7e8
refactor: Fixed typing of failed_trigger in TriggerRunner
dabla Nov 14, 2025
adae6bd
refactor: Add events directly to running_triggers
dabla Nov 14, 2025
cd2562d
refactor: Move import of DagRun outside type checking in DagBag
dabla Nov 14, 2025
4509a3d
refactor: Try fixing docstring KeyedHeadQueue
dabla Nov 14, 2025
b9767ca
refactor: Removed unused import of Context
dabla Nov 14, 2025
6056703
refactor: Added typing to trigger_id of run_trigger method
dabla Nov 14, 2025
756968f
refactor: Fixed test_run_inline_trigger_timeout
dabla Nov 14, 2025
740c373
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 14, 2025
2e40009
refactor: Reformatted test_run_inline_trigger_timeout
dabla Nov 14, 2025
4b99a3d
refactor: Fixed reformatting of test_run_inline_trigger_timeout
dabla Nov 14, 2025
33d0c8a
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Nov 26, 2025
2b82647
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 4, 2025
bd2e53d
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 4, 2025
e930c79
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 4, 2025
3c080d3
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 5, 2025
7585b04
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 5, 2025
e2436cb
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 5, 2025
90ccb46
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 5, 2025
f7460d5
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 6, 2025
2264d3d
refactor: Made task type of expand_mapped_task method broader
dabla Dec 6, 2025
ae5106d
refactor: Try fixing some mypy issues
dabla Dec 6, 2025
a4eea2a
refactor: Typed import of MappedOperator should be from SDK
dabla Dec 8, 2025
4243637
refactor: Fixed return type of __iter__ method in KeyedHeadQueue
dabla Dec 8, 2025
9a1ead7
refactor: Changed how events are appended to running triggers
dabla Dec 8, 2025
a7c4b5a
refactor: Try fixing events type in TriggerRunner
dabla Dec 8, 2025
bea2472
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 8, 2025
9e5eae2
Revert "refactor: Typed import of MappedOperator should be from SDK"
dabla Dec 8, 2025
fb69a6e
Revert "refactor: Try fixing events type in TriggerRunner"
dabla Dec 8, 2025
f3edfaf
refactor: Fixed type of trigger in typed dict TriggerDetails
dabla Dec 8, 2025
9abaa98
refactor: Try fixing typing of put method in PartitionedQueue
dabla Dec 8, 2025
4cf33a5
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 9, 2025
3944a13
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 9, 2025
ac3ecf7
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 11, 2025
e06bce8
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 12, 2025
3e16d51
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 15, 2025
ac02b23
refactor: Reformatted tests
dabla Dec 16, 2025
14770f0
refactor: Fixed import of import_string
dabla Dec 16, 2025
b262a44
refactor: Fixed typing of failed_triggers
dabla Dec 16, 2025
22aa1cf
refactor: Fixed typing for failed_triggers
dabla Dec 16, 2025
c36f282
refactor: Fixed typing for events
dabla Dec 16, 2025
cafce64
refactor: Fixed return type in PartitionedQueue popleft method
dabla Dec 16, 2025
926cc8f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 16, 2025
5dde73d
refactor: Applied some additional mypy fixes in TriggerJobRunner
dabla Dec 17, 2025
c60d1a4
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 17, 2025
1437a39
Revert "refactor: Fixed return type in PartitionedQueue popleft method"
dabla Dec 17, 2025
766f4c9
refactor: Fixed typing of failed_triggers in TriggerRunnerSupervisor
dabla Dec 17, 2025
7a63766
refactor: Try fixing typing in PartitionedQueue
dabla Dec 17, 2025
7336b1f
refactor: Fixing typing for events in TriggerRunner
dabla Dec 17, 2025
7f70e07
refactor: Split value typing for KeyedHeadQueue and PartitionQueue
dabla Dec 17, 2025
aa4aed6
refactor: Fixed typing of put argument in PartitionedQueue
dabla Dec 17, 2025
74a4ab7
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 17, 2025
90c2f7a
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 19, 2025
b59437d
refactor: Reformatted failed_triggers field
dabla Dec 19, 2025
5cd37fb
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 19, 2025
45f0120
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 21, 2025
a101aa4
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 21, 2025
aad7431
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 21, 2025
ac19469
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 24, 2025
4f1ed9a
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 24, 2025
26b8493
refactor: Fixed return type of popleft method in PartitionedQueue
dabla Dec 24, 2025
ff37282
refactor: Try fixing typing in PartitionedQueue
dabla Dec 24, 2025
3ff8971
refactor: task can also be None in expand_mapped_task
dabla Dec 24, 2025
09efd3f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 24, 2025
1eef384
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 25, 2025
d87b625
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 26, 2025
e4d496f
refactor: Refactored expand_mapped_task
dabla Dec 26, 2025
d1c42a2
refactor: Removed import of SerializedBaseOperator
dabla Dec 26, 2025
4cc65b8
refactor: Added Alembic migration for next_trigger_id column in task_…
dabla Dec 26, 2025
0796120
refactor: Fixed revision for 3.2.0 due to addition of next_trigger_id
dabla Dec 26, 2025
b4d47bb
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 26, 2025
ad5ff1c
refactor: Reformatted migration
dabla Dec 26, 2025
59bee57
refactor: Fixed typo column name in migration
dabla Dec 26, 2025
ba279ae
refactor: Fixed import of MappedOperator
dabla Dec 26, 2025
b02be85
refactor: Updated revisions in migrations ref
dabla Dec 26, 2025
ee9a015
refactor: Re-added missing start_trigger_args in TaskInstance
dabla Dec 26, 2025
437ed75
refactor: Fixed invocation start_trigger_args
dabla Dec 26, 2025
6cfba52
refactor: Make finished_triggers param empty by default in clean_unus…
dabla Dec 27, 2025
9f95896
refactor: Also assert next_trigger_id in test_refresh_from_db
dabla Dec 27, 2025
ca7ae82
refactor: Added period in docstring of upgrade and downgrade
dabla Dec 27, 2025
8cee46c
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 28, 2025
f40d835
refactor: Fixed base handle_event_submit method by allowing additiona…
dabla Dec 29, 2025
82ec424
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 31, 2025
c547363
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 31, 2025
3ac0eaf
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Dec 31, 2025
7247c6a
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 4, 2026
2dd6f54
refactor: Fixed revision in new migration for next_trigger_id
dabla Jan 4, 2026
320438d
refactor: Aligned with main
dabla Jan 4, 2026
106d7a2
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 4, 2026
b56fda9
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 4, 2026
ad23c4f
refactor: Updated docstring in migration
dabla Jan 4, 2026
5137957
refactor: Renamed migration ad fixed docstring description
dabla Jan 5, 2026
c3577d4
refactor: Changed description of migration and updated migrations-ref…
dabla Jan 5, 2026
22f173b
refactor: Fixed revises value in docstring migration
dabla Jan 6, 2026
c683d58
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 6, 2026
3ef4dbe
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 7, 2026
6a98df9
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 7, 2026
3109d4b
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 7, 2026
e8575bb
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 8, 2026
f06c55b
refactor: Increment migration number for add next_trigger_id column
dabla Jan 8, 2026
876e055
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 8, 2026
dacd755
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 8, 2026
abfdef6
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 8, 2026
5074bdb
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 8, 2026
1494e61
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 9, 2026
978085f
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 9, 2026
14f96a0
Merge branch 'main' into feature/aip-88-lazy-expandable-tasks
dabla Jan 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion airflow-core/docs/migrations-ref.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ Here's the list of all the Database Migrations that are executed via when you ru
+-------------------------+------------------+-------------------+--------------------------------------------------------------+
| Revision ID | Revises ID | Airflow Version | Description |
+=========================+==================+===================+==============================================================+
| ``e79fc784f145`` (head) | ``0b112f49112d`` | ``3.2.0`` | add timetable_type to dag table for filtering. |
| ``658517c60c7f`` (head) | ``e79fc784f145`` | ``3.2.0`` | Add ``next_trigger_id`` column to ``task_instance`` table. |
+-------------------------+------------------+-------------------+--------------------------------------------------------------+
| ``e79fc784f145`` | ``0b112f49112d`` | ``3.2.0`` | add timetable_type to dag table for filtering. |
+-------------------------+------------------+-------------------+--------------------------------------------------------------+
| ``0b112f49112d`` | ``c47f2e1ab9d4`` | ``3.2.0`` | Add exceeds max runs flag to dag model. |
+-------------------------+------------------+-------------------+--------------------------------------------------------------+
Expand Down
182 changes: 182 additions & 0 deletions airflow-core/src/airflow/jobs/queues.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import annotations

from asyncio import Lock as AsyncLock, Queue
from collections import OrderedDict, defaultdict, deque
from collections.abc import Iterable, Iterator
from threading import Lock
from typing import Generic, TypeVar

K = TypeVar("K")
V = TypeVar("V")
KV = TypeVar("KV", bound=tuple)


class KeyedHeadQueue(Generic[K, KV]):
"""
A keyed queue that manages values per key in insertion order.

Features:
- `popleft()` returns only the *first value* per key (in insertion order of keys).
- Once a key's first value is popped, that key will never yield in `popleft()` again.
- Remaining values for consumed keys are preserved.
- Iteration yields those leftover (key, value) pairs.

Example:
q = FirstValueQueue()
q.append(("task1", "event1"))
q.append(("task1", "event2"))
q.append(("task2", "eventA"))

q.popleft() # ('task1', 'event1')
q.popleft() # ('task2', 'eventA')

list(q) # [('task1', 'event2')]
"""

def __init__(self) -> None:
self.__map: OrderedDict[K, deque[KV]] = OrderedDict() # key -> deque of values
self.__popped_keys: set[K] = set() # keys whose first value has been consumed
self._lock = Lock()

@property
def _map(self) -> OrderedDict[K, list[KV]]:
with self._lock:
return OrderedDict((key, list(value)) for key, value in self.__map.items())

@property
def _popped_keys(self) -> set[K]:
with self._lock:
return set(self.__popped_keys)

def get(self, key: K, default_value: list[KV] | None = None) -> list[KV] | None:
return list(self._map.get(key, default_value or []))

def extend(self, elements: Iterable[KV]) -> None:
for element in elements:
self.append(element)

def append(self, element: KV) -> None:
"""Append a (key, value) pair unless key already consumed."""
key = element[0]
with self._lock:
if key not in self.__map:
self.__map[key] = deque()
self.__map[key].append(element)

def popleft(self) -> KV:
"""
Pop the *first inserted value* for the next key in order.

Raises IndexError if all first values have been popped.
"""
with self._lock:
for key, values in self.__map.items():
if key not in self.__popped_keys:
value = values.popleft()
self.__popped_keys.add(key)
if not values:
del self.__map[key]
return value
raise IndexError("pop from empty KeyedHeadQueue")

def popall(self) -> tuple[K, list[KV]]:
"""
Pop all values for the first unconsumed key (in insertion order).

Marks the key as consumed.
Raises IndexError if no keys remain.
"""
with self._lock:
for key in self.__map.keys():
if key not in self.__popped_keys:
values = list(self.__map.pop(key, []))
self.__popped_keys.add(key)
return key, values

raise IndexError("pop from empty KeyedHeadQueue")

def __contains__(self, key: K) -> bool:
return key in self._map

def __iter__(self) -> Iterator[tuple[K, KV]]:
"""Iterate over leftover (key, value) pairs in a snapshot, so concurrent appends during iteration are not visible."""
for key, values in self._map.items():
for value in values:
yield key, value

def __len__(self) -> int:
"""Count remaining values available."""
with self._lock:
return sum(len(value) for value in self.__map.values())

def __bool__(self) -> bool:
"""Count of keys that still have their first value available."""
with self._lock:
if not sum(1 for key in self.__map if key not in self.__popped_keys) > 0:
self.__popped_keys.clear()
return False
return True

def keys(self) -> list[K]:
"""Keys still waiting for their first value to be popped."""
with self._lock:
return [key for key in self.__map.keys() if key not in self.__popped_keys]


class PartitionedQueue(Generic[K, V], defaultdict[K, Queue[tuple[K, V]]]):
"""
Dict-like container where each key maps to an asyncio.Queue.

Tracks sizes safely for concurrent access.
Provides put(item) and popleft().
Uses a total counter to make __bool__ O(1).
Supports both async and threading locks.
"""

def __init__(self, maxsize: int = 0) -> None:
super().__init__(lambda: Queue(maxsize=maxsize))
self.maxsize = maxsize
self._async_locks: dict[K, AsyncLock] = defaultdict(AsyncLock)
self._locks: dict[K, Lock] = defaultdict(Lock)
self._sizes: dict[K, int] = defaultdict(int) # track sizes per key
self._total_size: int = 0 # total items across all queues

def __bool__(self) -> bool:
return self._total_size > 0

async def put(self, item: tuple[K, V]) -> None:
key = item[0]
queue = self[key]
async with self._async_locks[key]:
await queue.put(item)
with self._locks[key]:
self._sizes[key] += 1
self._total_size += 1

def popleft(self) -> tuple[K, V]:
"""Pop an item from the first non-empty queue synchronously (non-blocking) using thread lock."""
for key, queue in list(self.items()):
with self._locks[key]:
if self._sizes[key] > 0:
item = queue.get_nowait() # won't raise if size > 0
self._sizes[key] -= 1
self._total_size -= 1
return item
raise StopIteration
Loading
Loading