improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

improve grid/ti_summaries and grid/runs - #64034

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes
Apr 2, 2026
Merged

improve grid/ti_summaries and grid/runs#64034
pierrejeambrun merged 2 commits into
apache:mainfrom
henry3260:improve-grid--routes

Conversation

@henry3260

@henry3260henry3260 commented Mar 21, 2026

Copy link
Copy Markdown
Contributor

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

What

This improves the Grid API performance for DAGs with large mapped task instance cardinality.

There are two main changes:

  1. grid/runs no longer loads all task_instances / task_instances_histories for every DagRun on the page just to compute dag_versions.
    Instead, it fetches the paginated runs first and then performs a slimmer lookup for the distinct DAG versions needed for the response.

  2. grid/ti_summaries no longer builds and propagates full per-task-instance details lists while aggregating task groups.
    It now keeps only the summary data needed for the response, such as child state counts and min/max dates.

Why

The previous implementation scaled poorly for DAGs that combine:

  • deep TaskGroup nesting
  • large dynamic task mapping
  • many task instances per run

In particular, grid/ti_summaries was keeping details during aggregation even though those details are not part of the response model. This meant we were paying extra CPU and memory cost for intermediate data that was never returned to the client.

I don't think we should keep details in the summary path, because the response does not include them. Keeping them only increases temporary allocations and repeated copying when task-group summaries are rolled up.

Result

This keeps the API contract unchanged, but reduces unnecessary ORM loading and Python-side aggregation work.

On a local benchmark with 5 DAG runs and about 4002 task instances per run:

  • grid/runs median latency improved from ~2955 ms to ~43 ms
  • grid/runs tracemalloc peak dropped from ~104.6 MiB to ~1.7 MiB
  • grid/ti_summaries tracemalloc peak dropped from ~5.4 MiB to ~1.7 MiB

closes: #63975

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {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.

@boring-cyborgboring-cyborgBot added the area:API Airflow's REST/HTTP API label Mar 21, 2026
@henry3260
henry3260force-pushed the improve-grid--routes branch 2 times, most recently from 5d0add7 to 4691a38CompareMarch 21, 2026 16:58
@henry3260
henry3260 marked this pull request as ready for review March 21, 2026 18:02
@henry3260
henry3260force-pushed the improve-grid--routes branch from 4691a38 to de430afCompareMarch 22, 2026 05:36
@eladkaleladkal added this to the Airflow 3.1.9 milestone Mar 25, 2026

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR.

Performance gain looks super promising. 🎉

Just a couple of suggestion before we can go ahead.

Comment threadairflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.py Outdated
@henry3260
henry3260force-pushed the improve-grid--routes branch 3 times, most recently from 80559cf to fad072bCompareApril 1, 2026 16:30
@henry3260
henry3260force-pushed the improve-grid--routes branch from fad072b to dbaeda8CompareApril 1, 2026 17:15
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Improves performance and memory usage of the Grid UI FastAPI endpoints (/grid/runs and /grid/ti_summaries) for DAGs with deep TaskGroup nesting and high mapped task-instance cardinality, while keeping the API contract unchanged.

Changes:

  • Refactors /grid/runs to avoid eager-loading all task instances / history rows just to compute dag_versions, using a slimmer post-fetch preloading step instead.
  • Refactors /grid/ti_summaries aggregation to use a compact summary object (GridNodeAgg) and avoid building/propagating per-TI details lists during TaskGroup rollups.
  • Adds a unit test covering the “multiple DAG versions per run” response shape for /grid/runs.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

FileDescription
airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_grid.pyAdds regression test for multiple dag_versions per run in /grid/runs.
airflow-core/src/airflow/api_fastapi/core_api/services/ui/grid.pyIntroduces GridNodeAgg and updates aggregate building to avoid propagating TI details.
airflow-core/src/airflow/api_fastapi/core_api/routes/ui/grid.pyUpdates Grid routes to use slim dag-version prefetching for runs and streaming/compact TI summary aggregation.

@pierrejeambrunpierrejeambrun left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, looking good, thanks.

@pierrejeambrun

Copy link
Copy Markdown
Member

Unrelated CI failure, merging.

@pierrejeambrun
pierrejeambrun merged commit 128e11d into apache:mainApr 2, 2026
147 of 149 checks passed
@bbovenzi

Copy link
Copy Markdown
Contributor

#protm another big improvement to the grid view!

@vatsrahul1001

vatsrahul1001 commented May 15, 2026

Copy link
Copy Markdown
Contributor

@bbovenzi do we need this in 3.2.2? or ok to be moved to 3.3.0 as its an improvement

vatsrahul1001 added a commit that referenced this pull request May 19, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
* improve grid/ti_summaries and grid/runs (#64034)
* improve grid/ti_summaries and grid/runs
* remove serdag
* Fix tests
* Undo migration file change
---------
Co-authored-by: Henry Chen <henryhenry0512@gmail.com>
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:APIAirflow's REST/HTTP APItype:bug-fixChangelog: Bug Fixes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

API server OOM / 500s: grid ti_summaries and grid/runs load unbounded task instances for heavily mapped DAG runs

6 participants

@henry3260@pierrejeambrun@bbovenzi@vatsrahul1001@eladkal