Cache requires_access_dag checks and other auth manager redundant checks #61485

Description

@tirkarthi

Apache Airflow version

main (development)

If "Other Airflow 3 version" selected, which one?

No response

What happened?

In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
Summary:
Total:	0.6636 secs
Slowest:	0.0171 secs
Fastest:	0.0098 secs
Average:	0.0132 secs
Requests/sec:	301.3933
Response time histogram:
0.010 [1]	|■
0.011 [2]	|■
0.011 [3]	|■■
0.012 [17]	|■■■■■■■■■■■■■
0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.015 [25]	|■■■■■■■■■■■■■■■■■■■
0.016 [8]	|■■■■■■
0.016 [5]	|■■■■
0.017 [2]	|■
Latency distribution:
10% in 0.0119 secs
25% in 0.0124 secs
50% in 0.0131 secs
75% in 0.0139 secs
90% in 0.0146 secs
95% in 0.0154 secs
99% in 0.0170 secs
Details (average, fastest, slowest):
DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
Status code distribution:
[200]	200 responses
hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total

After caching requires_access_dag, teams and serialized dag retrieval

time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
Summary:
Total:	0.3493 secs
Slowest:	0.0283 secs
Fastest:	0.0047 secs
Average:	0.0069 secs
Requests/sec:	572.6096
Response time histogram:
0.005 [1]	|
0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0.009 [24]	|■■■■■■
0.012 [3]	|■
0.014 [0]	|
0.017 [0]	|
0.019 [0]	|
0.021 [1]	|
0.024 [0]	|
0.026 [1]	|
0.028 [2]	|
Latency distribution:
10% in 0.0057 secs
25% in 0.0061 secs
50% in 0.0064 secs
75% in 0.0068 secs
90% in 0.0074 secs
95% in 0.0084 secs
99% in 0.0283 secs
Details (average, fastest, slowest):
DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
Status code distribution:
[200]	200 responses
hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total

What you think should happen instead?

No response

How to reproduce

  1. Load the dag page with 10 dagruns.
  2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

Operating System

Ubuntu 20.04

Versions of Apache Airflow Providers

No response

Deployment

Virtualenv installation

Deployment details

No response

Anything else?

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    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;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } 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

    Cache requires_access_dag checks and other auth manager redundant checks #61485

    Description

    @tirkarthi

    Apache Airflow version

    main (development)

    If "Other Airflow 3 version" selected, which one?

    No response

    What happened?

    In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

    Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

    This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

    time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
    Summary:
    Total:	0.6636 secs
    Slowest:	0.0171 secs
    Fastest:	0.0098 secs
    Average:	0.0132 secs
    Requests/sec:	301.3933
    Response time histogram:
    0.010 [1]	|■
    0.011 [2]	|■
    0.011 [3]	|■■
    0.012 [17]	|■■■■■■■■■■■■■
    0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
    0.015 [25]	|■■■■■■■■■■■■■■■■■■■
    0.016 [8]	|■■■■■■
    0.016 [5]	|■■■■
    0.017 [2]	|■
    Latency distribution:
    10% in 0.0119 secs
    25% in 0.0124 secs
    50% in 0.0131 secs
    75% in 0.0139 secs
    90% in 0.0146 secs
    95% in 0.0154 secs
    99% in 0.0170 secs
    Details (average, fastest, slowest):
    DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
    DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
    req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
    resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
    resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
    Status code distribution:
    [200]	200 responses
    hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
    

    After caching requires_access_dag, teams and serialized dag retrieval

    time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
    Summary:
    Total:	0.3493 secs
    Slowest:	0.0283 secs
    Fastest:	0.0047 secs
    Average:	0.0069 secs
    Requests/sec:	572.6096
    Response time histogram:
    0.005 [1]	|
    0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
    0.009 [24]	|■■■■■■
    0.012 [3]	|■
    0.014 [0]	|
    0.017 [0]	|
    0.019 [0]	|
    0.021 [1]	|
    0.024 [0]	|
    0.026 [1]	|
    0.028 [2]	|
    Latency distribution:
    10% in 0.0057 secs
    25% in 0.0061 secs
    50% in 0.0064 secs
    75% in 0.0068 secs
    90% in 0.0074 secs
    95% in 0.0084 secs
    99% in 0.0283 secs
    Details (average, fastest, slowest):
    DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
    DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
    req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
    resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
    resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
    Status code distribution:
    [200]	200 responses
    hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
    

    What you think should happen instead?

    No response

    How to reproduce

    1. Load the dag page with 10 dagruns.
    2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

    Operating System

    Ubuntu 20.04

    Versions of Apache Airflow Providers

    No response

    Deployment

    Virtualenv installation

    Deployment details

    No response

    Anything else?

    No response

    Are you willing to submit PR?

    • Yes I am willing to submit a PR!

    Code of Conduct

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

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

      Cache requires_access_dag checks and other auth manager redundant checks #61485

      Description

      @tirkarthi

      Apache Airflow version

      main (development)

      If "Other Airflow 3 version" selected, which one?

      No response

      What happened?

      In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

      Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

      This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

      time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
      Summary:
      Total:	0.6636 secs
      Slowest:	0.0171 secs
      Fastest:	0.0098 secs
      Average:	0.0132 secs
      Requests/sec:	301.3933
      Response time histogram:
      0.010 [1]	|■
      0.011 [2]	|■
      0.011 [3]	|■■
      0.012 [17]	|■■■■■■■■■■■■■
      0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.015 [25]	|■■■■■■■■■■■■■■■■■■■
      0.016 [8]	|■■■■■■
      0.016 [5]	|■■■■
      0.017 [2]	|■
      Latency distribution:
      10% in 0.0119 secs
      25% in 0.0124 secs
      50% in 0.0131 secs
      75% in 0.0139 secs
      90% in 0.0146 secs
      95% in 0.0154 secs
      99% in 0.0170 secs
      Details (average, fastest, slowest):
      DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
      DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
      req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
      resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
      resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
      Status code distribution:
      [200]	200 responses
      hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
      

      After caching requires_access_dag, teams and serialized dag retrieval

      time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
      Summary:
      Total:	0.3493 secs
      Slowest:	0.0283 secs
      Fastest:	0.0047 secs
      Average:	0.0069 secs
      Requests/sec:	572.6096
      Response time histogram:
      0.005 [1]	|
      0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.009 [24]	|■■■■■■
      0.012 [3]	|■
      0.014 [0]	|
      0.017 [0]	|
      0.019 [0]	|
      0.021 [1]	|
      0.024 [0]	|
      0.026 [1]	|
      0.028 [2]	|
      Latency distribution:
      10% in 0.0057 secs
      25% in 0.0061 secs
      50% in 0.0064 secs
      75% in 0.0068 secs
      90% in 0.0074 secs
      95% in 0.0084 secs
      99% in 0.0283 secs
      Details (average, fastest, slowest):
      DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
      DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
      req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
      resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
      resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
      Status code distribution:
      [200]	200 responses
      hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
      

      What you think should happen instead?

      No response

      How to reproduce

      1. Load the dag page with 10 dagruns.
      2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

      Operating System

      Ubuntu 20.04

      Versions of Apache Airflow Providers

      No response

      Deployment

      Virtualenv installation

      Deployment details

      No response

      Anything else?

      No response

      Are you willing to submit PR?

      • Yes I am willing to submit a PR!

      Code of Conduct

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

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

        Cache requires_access_dag checks and other auth manager redundant checks #61485

        Description

        @tirkarthi

        Apache Airflow version

        main (development)

        If "Other Airflow 3 version" selected, which one?

        No response

        What happened?

        In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

        Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

        This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

        time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
        Summary:
        Total:	0.6636 secs
        Slowest:	0.0171 secs
        Fastest:	0.0098 secs
        Average:	0.0132 secs
        Requests/sec:	301.3933
        Response time histogram:
        0.010 [1]	|■
        0.011 [2]	|■
        0.011 [3]	|■■
        0.012 [17]	|■■■■■■■■■■■■■
        0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
        0.015 [25]	|■■■■■■■■■■■■■■■■■■■
        0.016 [8]	|■■■■■■
        0.016 [5]	|■■■■
        0.017 [2]	|■
        Latency distribution:
        10% in 0.0119 secs
        25% in 0.0124 secs
        50% in 0.0131 secs
        75% in 0.0139 secs
        90% in 0.0146 secs
        95% in 0.0154 secs
        99% in 0.0170 secs
        Details (average, fastest, slowest):
        DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
        DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
        req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
        resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
        resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
        Status code distribution:
        [200]	200 responses
        hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
        

        After caching requires_access_dag, teams and serialized dag retrieval

        time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
        Summary:
        Total:	0.3493 secs
        Slowest:	0.0283 secs
        Fastest:	0.0047 secs
        Average:	0.0069 secs
        Requests/sec:	572.6096
        Response time histogram:
        0.005 [1]	|
        0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
        0.009 [24]	|■■■■■■
        0.012 [3]	|■
        0.014 [0]	|
        0.017 [0]	|
        0.019 [0]	|
        0.021 [1]	|
        0.024 [0]	|
        0.026 [1]	|
        0.028 [2]	|
        Latency distribution:
        10% in 0.0057 secs
        25% in 0.0061 secs
        50% in 0.0064 secs
        75% in 0.0068 secs
        90% in 0.0074 secs
        95% in 0.0084 secs
        99% in 0.0283 secs
        Details (average, fastest, slowest):
        DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
        DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
        req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
        resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
        resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
        Status code distribution:
        [200]	200 responses
        hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
        

        What you think should happen instead?

        No response

        How to reproduce

        1. Load the dag page with 10 dagruns.
        2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

        Operating System

        Ubuntu 20.04

        Versions of Apache Airflow Providers

        No response

        Deployment

        Virtualenv installation

        Deployment details

        No response

        Anything else?

        No response

        Are you willing to submit PR?

        • Yes I am willing to submit a PR!

        Code of Conduct

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

          Cache requires_access_dag checks and other auth manager redundant checks #61485

          Description

          @tirkarthi

          Apache Airflow version

          main (development)

          If "Other Airflow 3 version" selected, which one?

          No response

          What happened?

          In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

          Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

          This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

          time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
          Summary:
          Total:	0.6636 secs
          Slowest:	0.0171 secs
          Fastest:	0.0098 secs
          Average:	0.0132 secs
          Requests/sec:	301.3933
          Response time histogram:
          0.010 [1]	|■
          0.011 [2]	|■
          0.011 [3]	|■■
          0.012 [17]	|■■■■■■■■■■■■■
          0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
          0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
          0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
          0.015 [25]	|■■■■■■■■■■■■■■■■■■■
          0.016 [8]	|■■■■■■
          0.016 [5]	|■■■■
          0.017 [2]	|■
          Latency distribution:
          10% in 0.0119 secs
          25% in 0.0124 secs
          50% in 0.0131 secs
          75% in 0.0139 secs
          90% in 0.0146 secs
          95% in 0.0154 secs
          99% in 0.0170 secs
          Details (average, fastest, slowest):
          DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
          DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
          req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
          resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
          resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
          Status code distribution:
          [200]	200 responses
          hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
          

          After caching requires_access_dag, teams and serialized dag retrieval

          time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
          Summary:
          Total:	0.3493 secs
          Slowest:	0.0283 secs
          Fastest:	0.0047 secs
          Average:	0.0069 secs
          Requests/sec:	572.6096
          Response time histogram:
          0.005 [1]	|
          0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
          0.009 [24]	|■■■■■■
          0.012 [3]	|■
          0.014 [0]	|
          0.017 [0]	|
          0.019 [0]	|
          0.021 [1]	|
          0.024 [0]	|
          0.026 [1]	|
          0.028 [2]	|
          Latency distribution:
          10% in 0.0057 secs
          25% in 0.0061 secs
          50% in 0.0064 secs
          75% in 0.0068 secs
          90% in 0.0074 secs
          95% in 0.0084 secs
          99% in 0.0283 secs
          Details (average, fastest, slowest):
          DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
          DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
          req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
          resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
          resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
          Status code distribution:
          [200]	200 responses
          hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
          

          What you think should happen instead?

          No response

          How to reproduce

          1. Load the dag page with 10 dagruns.
          2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

          Operating System

          Ubuntu 20.04

          Versions of Apache Airflow Providers

          No response

          Deployment

          Virtualenv installation

          Deployment details

          No response

          Anything else?

          No response

          Are you willing to submit PR?

          • Yes I am willing to submit a PR!

          Code of Conduct

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

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

            Cache requires_access_dag checks and other auth manager redundant checks #61485

            Description

            @tirkarthi

            Apache Airflow version

            main (development)

            If "Other Airflow 3 version" selected, which one?

            No response

            What happened?

            In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

            Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

            This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

            time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
            Summary:
            Total:	0.6636 secs
            Slowest:	0.0171 secs
            Fastest:	0.0098 secs
            Average:	0.0132 secs
            Requests/sec:	301.3933
            Response time histogram:
            0.010 [1]	|■
            0.011 [2]	|■
            0.011 [3]	|■■
            0.012 [17]	|■■■■■■■■■■■■■
            0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
            0.015 [25]	|■■■■■■■■■■■■■■■■■■■
            0.016 [8]	|■■■■■■
            0.016 [5]	|■■■■
            0.017 [2]	|■
            Latency distribution:
            10% in 0.0119 secs
            25% in 0.0124 secs
            50% in 0.0131 secs
            75% in 0.0139 secs
            90% in 0.0146 secs
            95% in 0.0154 secs
            99% in 0.0170 secs
            Details (average, fastest, slowest):
            DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
            DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
            req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
            resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
            resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
            Status code distribution:
            [200]	200 responses
            hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
            

            After caching requires_access_dag, teams and serialized dag retrieval

            time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
            Summary:
            Total:	0.3493 secs
            Slowest:	0.0283 secs
            Fastest:	0.0047 secs
            Average:	0.0069 secs
            Requests/sec:	572.6096
            Response time histogram:
            0.005 [1]	|
            0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
            0.009 [24]	|■■■■■■
            0.012 [3]	|■
            0.014 [0]	|
            0.017 [0]	|
            0.019 [0]	|
            0.021 [1]	|
            0.024 [0]	|
            0.026 [1]	|
            0.028 [2]	|
            Latency distribution:
            10% in 0.0057 secs
            25% in 0.0061 secs
            50% in 0.0064 secs
            75% in 0.0068 secs
            90% in 0.0074 secs
            95% in 0.0084 secs
            99% in 0.0283 secs
            Details (average, fastest, slowest):
            DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
            DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
            req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
            resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
            resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
            Status code distribution:
            [200]	200 responses
            hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
            

            What you think should happen instead?

            No response

            How to reproduce

            1. Load the dag page with 10 dagruns.
            2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

            Operating System

            Ubuntu 20.04

            Versions of Apache Airflow Providers

            No response

            Deployment

            Virtualenv installation

            Deployment details

            No response

            Anything else?

            No response

            Are you willing to submit PR?

            • Yes I am willing to submit a PR!

            Code of Conduct

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

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

              Cache requires_access_dag checks and other auth manager redundant checks #61485

              Description

              @tirkarthi

              Apache Airflow version

              main (development)

              If "Other Airflow 3 version" selected, which one?

              No response

              What happened?

              In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

              Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

              This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

              time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
              Summary:
              Total:	0.6636 secs
              Slowest:	0.0171 secs
              Fastest:	0.0098 secs
              Average:	0.0132 secs
              Requests/sec:	301.3933
              Response time histogram:
              0.010 [1]	|■
              0.011 [2]	|■
              0.011 [3]	|■■
              0.012 [17]	|■■■■■■■■■■■■■
              0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
              0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
              0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
              0.015 [25]	|■■■■■■■■■■■■■■■■■■■
              0.016 [8]	|■■■■■■
              0.016 [5]	|■■■■
              0.017 [2]	|■
              Latency distribution:
              10% in 0.0119 secs
              25% in 0.0124 secs
              50% in 0.0131 secs
              75% in 0.0139 secs
              90% in 0.0146 secs
              95% in 0.0154 secs
              99% in 0.0170 secs
              Details (average, fastest, slowest):
              DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
              DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
              req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
              resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
              resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
              Status code distribution:
              [200]	200 responses
              hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
              

              After caching requires_access_dag, teams and serialized dag retrieval

              time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
              Summary:
              Total:	0.3493 secs
              Slowest:	0.0283 secs
              Fastest:	0.0047 secs
              Average:	0.0069 secs
              Requests/sec:	572.6096
              Response time histogram:
              0.005 [1]	|
              0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
              0.009 [24]	|■■■■■■
              0.012 [3]	|■
              0.014 [0]	|
              0.017 [0]	|
              0.019 [0]	|
              0.021 [1]	|
              0.024 [0]	|
              0.026 [1]	|
              0.028 [2]	|
              Latency distribution:
              10% in 0.0057 secs
              25% in 0.0061 secs
              50% in 0.0064 secs
              75% in 0.0068 secs
              90% in 0.0074 secs
              95% in 0.0084 secs
              99% in 0.0283 secs
              Details (average, fastest, slowest):
              DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
              DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
              req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
              resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
              resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
              Status code distribution:
              [200]	200 responses
              hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
              

              What you think should happen instead?

              No response

              How to reproduce

              1. Load the dag page with 10 dagruns.
              2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

              Operating System

              Ubuntu 20.04

              Versions of Apache Airflow Providers

              No response

              Deployment

              Virtualenv installation

              Deployment details

              No response

              Anything else?

              No response

              Are you willing to submit PR?

              • Yes I am willing to submit a PR!

              Code of Conduct

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

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

                Cache requires_access_dag checks and other auth manager redundant checks #61485

                Description

                @tirkarthi

                Apache Airflow version

                main (development)

                If "Other Airflow 3 version" selected, which one?

                No response

                What happened?

                In Airflow 2 when a dag page is loaded the grid is loaded along with the details tab. Loading a dag page had only 4-5 requests for grid data, details, asset events etc. In Airflow 3 since the dag page now uses an API call per dagrun it results in 10 API calls along with API calls for other parts of the page like structure_data, plugins, config, backfills, hitl, dag warnings, recent dag runs, recent task instances, asset events, latest run resulting in total of 25-30 API calls. Along with the fact that auto refresh is 3 seconds many of these API calls are made again once the initial API call finishes.

                Each API call has a set of dependencies and we noticed that requires_access_dag is checked per request for a ti_summary. For 10 requests to load the grid this results in 10 checks though this never changes in between the API calls. We also noticed that per requires_access_dag also fetches the team for the dag which also doesn't change often, We enabled caching these checks with an in-memory cache and this helped in noticeable performance improvements. This also reduces the db load with the requests served faster helping workers to process other requests. This also helps with other endpoints where require_access_dag check is performed redundantly.

                This involves caching the is_authorize_dag check which users can do by customizing the auth manager but I opened this up for discussion. Git branch with patches : https://github.com/tirkarthi/airflow/tree/cache-requires-check

                time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
                Summary:
                Total:	0.6636 secs
                Slowest:	0.0171 secs
                Fastest:	0.0098 secs
                Average:	0.0132 secs
                Requests/sec:	301.3933
                Response time histogram:
                0.010 [1]	|■
                0.011 [2]	|■
                0.011 [3]	|■■
                0.012 [17]	|■■■■■■■■■■■■■
                0.013 [46]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                0.013 [54]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                0.014 [37]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■
                0.015 [25]	|■■■■■■■■■■■■■■■■■■■
                0.016 [8]	|■■■■■■
                0.016 [5]	|■■■■
                0.017 [2]	|■
                Latency distribution:
                10% in 0.0119 secs
                25% in 0.0124 secs
                50% in 0.0131 secs
                75% in 0.0139 secs
                90% in 0.0146 secs
                95% in 0.0154 secs
                99% in 0.0170 secs
                Details (average, fastest, slowest):
                DNS+dialup:	0.0000 secs, 0.0098 secs, 0.0171 secs
                DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0004 secs
                req write:	0.0000 secs, 0.0000 secs, 0.0002 secs
                resp wait:	0.0130 secs, 0.0095 secs, 0.0168 secs
                resp read:	0.0002 secs, 0.0000 secs, 0.0008 secs
                Status code distribution:
                [200]	200 responses
                hey -c 4 -H 0.08s user 0.05s system 19% cpu 0.672 total
                

                After caching requires_access_dag, teams and serialized dag retrieval

                time hey -c 4 -H 'Cookie: session=07b3594d-405a-489b-ae0c-02ee02c9bbdb.uq376NuwgAarpTdjToOPTJuO2a0; _token=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwianRpIjoiZWVhN2RhODBkZjFjNGRmMjkxZWRmMzE1YzBlNTZmNDQiLCJhdWQiOiJhcGFjaGUtYWlyZmxvdyIsIm5iZiI6MTc3MDI3NDU0MCwiZXhwIjoxNzcwMjc4MTQwLCJpYXQiOjE3NzAyNzQ1NDB9.gVjrIncHUIswAGwQ4IHR-nbmfrLWzQFWPSl1M1wex_Vm9De8DOjAI8bM1v5mOGOfXil-Y5jp0bGGVp4rSlwwSw' 'http://localhost:8000/ui/grid/ti_summaries/asset_produces_2/manual__2026-01-31T05:00:20.973352+00:00'
                Summary:
                Total:	0.3493 secs
                Slowest:	0.0283 secs
                Fastest:	0.0047 secs
                Average:	0.0069 secs
                Requests/sec:	572.6096
                Response time histogram:
                0.005 [1]	|
                0.007 [168]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                0.009 [24]	|■■■■■■
                0.012 [3]	|■
                0.014 [0]	|
                0.017 [0]	|
                0.019 [0]	|
                0.021 [1]	|
                0.024 [0]	|
                0.026 [1]	|
                0.028 [2]	|
                Latency distribution:
                10% in 0.0057 secs
                25% in 0.0061 secs
                50% in 0.0064 secs
                75% in 0.0068 secs
                90% in 0.0074 secs
                95% in 0.0084 secs
                99% in 0.0283 secs
                Details (average, fastest, slowest):
                DNS+dialup:	0.0000 secs, 0.0047 secs, 0.0283 secs
                DNS-lookup:	0.0000 secs, 0.0000 secs, 0.0006 secs
                req write:	0.0002 secs, 0.0000 secs, 0.0205 secs
                resp wait:	0.0063 secs, 0.0043 secs, 0.0093 secs
                resp read:	0.0003 secs, 0.0000 secs, 0.0182 secs
                Status code distribution:
                [200]	200 responses
                hey -c 4 -H 0.07s user 0.05s system 31% cpu 0.354 total
                

                What you think should happen instead?

                No response

                How to reproduce

                1. Load the dag page with 10 dagruns.
                2. Add a print statement to requires_access_dag function which is printed per API call though access to dag in one instance indicates this check is not required for future ti_summary API calls.

                Operating System

                Ubuntu 20.04

                Versions of Apache Airflow Providers

                No response

                Deployment

                Virtualenv installation

                Deployment details

                No response

                Anything else?

                No response

                Are you willing to submit PR?

                • Yes I am willing to submit a PR!

                Code of Conduct

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions