This is an automated email from the ASF dual-hosted git repository.
rahulvats pushed a commit to branch v3-2-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-2-test by this push:
new 84f7eaf3852 [v3-2-test] Fix get_team_name_dep creating wasted async
sessions when multi_team=False (#65275) (#65282)
84f7eaf3852 is described below
commit 84f7eaf38520ff47b26f16211ff07dc0f6eb057c
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Apr 15 11:56:38 2026 +0530
[v3-2-test] Fix get_team_name_dep creating wasted async sessions when
multi_team=False (#65275) (#65282)
get_team_name_dep() declared AsyncSessionDep as a FastAPI dependency
parameter, which meant FastAPI checked out an async database connection
on every Execution API request -- even when multi_team=False (the
default), where the function immediately returned None without using
the session.
Remove the AsyncSessionDep parameter and create the session inside the
function only when multi_team=True. This avoids a connection checkout,
no-op commit round-trip, and connection return on every connection and
variable lookup from workers.
(cherry picked from commit 1e64f418ad55c2fa8a9a56f8c544ac4a247ed1c1)
Co-authored-by: Kaxil Naik <[email protected]>
---
.../airflow/api_fastapi/execution_api/security.py | 17 ++++++++------
.../api_fastapi/execution_api/test_security.py | 26 +++++++++++++++++++++-
2 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/security.py
b/airflow-core/src/airflow/api_fastapi/execution_api/security.py
index 215997d28d9..19a29f7405d 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/security.py
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/security.py
@@ -74,10 +74,8 @@ from fastapi import Depends, HTTPException, Request, status
from fastapi.params import Security as SecurityParam
from fastapi.routing import APIRoute
from fastapi.security import HTTPBearer, SecurityScopes
-from sqlalchemy import select
from airflow.api_fastapi.auth.tokens import JWTValidator
-from airflow.api_fastapi.common.db.common import AsyncSessionDep
from airflow.api_fastapi.execution_api.datamodels.token import TIToken
from airflow.api_fastapi.execution_api.deps import DepContainer
@@ -222,16 +220,20 @@ class ExecutionAPIRoute(APIRoute):
self.allowed_token_types = frozenset(token_scopes) if token_scopes
else frozenset({"execution"})
-async def get_team_name_dep(session: AsyncSessionDep, token=CurrentTIToken) ->
str | None:
+async def get_team_name_dep(token=CurrentTIToken) -> str | None:
"""Return the team name associated to the task (if any)."""
from airflow.configuration import conf
- from airflow.models import DagModel, TaskInstance
- from airflow.models.dagbundle import DagBundleModel
- from airflow.models.team import Team
if not conf.getboolean("core", "multi_team"):
return None
+ from sqlalchemy import select
+
+ from airflow.models import DagModel, TaskInstance
+ from airflow.models.dagbundle import DagBundleModel
+ from airflow.models.team import Team
+ from airflow.utils.session import create_session_async
+
stmt = (
select(Team.name)
.select_from(TaskInstance)
@@ -240,4 +242,5 @@ async def get_team_name_dep(session: AsyncSessionDep,
token=CurrentTIToken) -> s
.join(DagBundleModel.teams)
.where(TaskInstance.id == token.id)
)
- return await session.scalar(stmt)
+ async with create_session_async() as session:
+ return await session.scalar(stmt)
diff --git a/airflow-core/tests/unit/api_fastapi/execution_api/test_security.py
b/airflow-core/tests/unit/api_fastapi/execution_api/test_security.py
index 8fff2c9f732..29ca8901efb 100644
--- a/airflow-core/tests/unit/api_fastapi/execution_api/test_security.py
+++ b/airflow-core/tests/unit/api_fastapi/execution_api/test_security.py
@@ -16,6 +16,7 @@
# under the License.
from __future__ import annotations
+from unittest.mock import MagicMock, patch
from uuid import UUID
import pytest
@@ -23,7 +24,12 @@ from fastapi import APIRouter, FastAPI, Request, Security
from fastapi.testclient import TestClient
from airflow.api_fastapi.execution_api.datamodels.token import TIToken
-from airflow.api_fastapi.execution_api.security import ExecutionAPIRoute,
_jwt_bearer, require_auth
+from airflow.api_fastapi.execution_api.security import (
+ ExecutionAPIRoute,
+ _jwt_bearer,
+ get_team_name_dep,
+ require_auth,
+)
class TestExecutionAPIRoute:
@@ -136,3 +142,21 @@ class TestTokenTypeScopeEnforcement:
run = client.get(f"/task-instances/{self.TI_ID}/run",
headers={"Authorization": "Bearer fake"})
assert state.status_code == 200
assert run.status_code == 200
+
+
+class TestGetTeamNameDep:
+ """Tests for get_team_name_dep avoiding unnecessary async sessions."""
+
+ @pytest.mark.asyncio
+ async def test_returns_none_without_session_when_multi_team_disabled(self):
+ """When multi_team=False, no async session should be created."""
+ token = MagicMock(spec=TIToken)
+
+ with (
+ patch("airflow.configuration.conf.getboolean", return_value=False),
+ patch("airflow.utils.session.create_session_async") as
mock_create_session,
+ ):
+ result = await get_team_name_dep(token=token)
+
+ assert result is None
+ mock_create_session.assert_not_called()