Improve Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001
, '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 Graph View Performance - #65031

Merged
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance
Apr 20, 2026
Merged

Improve Graph View Performance#65031
pierrejeambrun merged 2 commits into
apache:mainfrom
astronomer:improve-graph-performance

Conversation

@bbovenzi

Copy link
Copy Markdown
Contributor
  • Make it easier to navigate by restoring "Zoom to Task" button and increase minZoom to 0.01 for large dags
  • Use Elk Worker to move calculation off the main thread
  • Reduce number of times we're walking through all Nodes and Edges
  • Simplify Node components by disabling unused callbacks
  • Simplify elk graph calculation settings for large graphs (edge thoroughness and opting for simple placement)
  • Turn off minimap for truly large dags (requires calculating the graph twice)

Closes#64970


Was generative AI tooling used to co-author this PR?
  • Yes Claude Sonnet 4.6

  • 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.

@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.

LGTM, tested, working as expected.

Just realized that the Graph isn't updated live on auto-refresh (right panel is, but we need to force a refresh to get the TI current status). That problem isn't related to this code change. Interacting with the graph to trigger a re-render will make it refresh tough

@pierrejeambrun
pierrejeambrun merged commit f6a354d into apache:mainApr 20, 2026
401 of 403 checks passed
@pierrejeambrun
pierrejeambrun deleted the improve-graph-performance branch April 20, 2026 12:28
github-actionsBot pushed a commit that referenced this pull request Apr 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
bbovenzi added a commit that referenced this pull request Apr 21, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 23, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
* Add various improvements to graph view
* fix tests
(cherry picked from commit f6a354d)
Co-authored-by: Brent Bovenzi <brent@astronomer.io>
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
Closes: #67714
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jun 1, 2026
…l nodes (apache#67720)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from apache#65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in apache#67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Closes: apache#67714
pierrejeambrun pushed a commit that referenced this pull request Jun 1, 2026
…l nodes (#67720) (#67830)
Open ``@task_group`` rendered with vertically-stacked internals and edges
crossing the boundary whenever an internal task had a direct dependency
on a node outside the group (an "escape edge" that bypassed the group's
entry/exit interface). Dag execution was unaffected.
Two underlying issues, both in the ELK graph-layout refactor from #65031:
1. ``hasUniformExternalConnectivity`` was too lenient — it fired whenever
externally-connected children separately shared the same external
sources OR the same external targets, instead of the canonical
fan-in/fan-out pattern where every child has the same full
``(sources, targets)`` profile. On mixed-profile groups (entry +
exits), it incorrectly fired and collapsed the author's deliberately-
wired escape edges into a single group-level edge, hiding the intent.
2. When the optimisation did fire on an open group, ``rewriteGroupEdges``
was tuned for closed groups and dropped the group's internal edges
too, leaving ELK with no internal-layout information for the children
(the visible symptom in #67714).
Fix: tighten ``hasUniformExternalConnectivity`` to require the full
profile to match across externally-connected children, and add a
``preserveInternal`` option to ``rewriteGroupEdges`` so the canonical
fan-in/fan-out path keeps internals intact.
(cherry picked from commit 55780f2)
Closes: #67714
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:translationsarea:UIRelated to UI/UX. For Frontend Developers.translation:default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add virtualization to dag and asset graphs

3 participants

@bbovenzi@pierrejeambrun@vatsrahul1001