You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by ka...@apache.org on 2025/10/30 22:56:51 UTC
(airflow) branch v3-1-test updated: Fix connection retrieval in `DagProcessorManager` for bundle initialization (#57459)
This is an automated email from the ASF dual-hosted git repository.
kaxilnaik pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-1-test by this push:
new d60088251ad Fix connection retrieval in `DagProcessorManager` for bundle initialization (#57459)
d60088251ad is described below
commit d60088251ad43fe2994c116bc37e42d732511a77
Author: Dheeraj Turaga <dh...@gmail.com>
AuthorDate: Thu Oct 30 17:56:15 2025 -0500
Fix connection retrieval in `DagProcessorManager` for bundle initialization (#57459)
The dag_processor was unable to retrieve connections from the database,
causing GitHook (and other hooks) to fail with:
AirflowNotFoundException: The conn_id `<conn_id>` isn't defined
Root cause: DagProcessorManager was running in FALLBACK context, which only
loads EnvironmentVariablesBackend, not MetastoreBackend. This meant
connections stored in the database were inaccessible.
The `DagProcessorManager` (parent process) needs database access for connection
retrieval during bundle initialization (e.g., `GitDagBundle.__init__` → `GitHook`
needs git credentials). Child `DagFileProcessorProcess` instances run user code
and should remain isolated from direct database access.
This ensures correct secrets backend chains (when no external secrets backend is configured):
- Manager (parent): `EnvironmentVariablesBackend` → `MetastoreBackend` (database access)
- Parser (child): `EnvironmentVariablesBackend`
Note: This is temporary until AIP-92 removes direct DB access from DagProcessorManager.
Long-term, the manager should use the Execution API instead of direct database access.
Affects: DAG bundle processing with GitHook and any other hooks that rely on
database-stored connections during bundle initialization in the manager process.
(cherry picked from commit ae2a4fd50442b04346d58383f16fd9fa0de00c26)
---
airflow-core/src/airflow/dag_processing/manager.py | 10 ++++++++++
airflow-core/src/airflow/dag_processing/processor.py | 4 ++++
2 files changed, 14 insertions(+)
diff --git a/airflow-core/src/airflow/dag_processing/manager.py b/airflow-core/src/airflow/dag_processing/manager.py
index 5c32d7daa6f..c774aa29fc6 100644
--- a/airflow-core/src/airflow/dag_processing/manager.py
+++ b/airflow-core/src/airflow/dag_processing/manager.py
@@ -250,6 +250,16 @@ class DagFileProcessorManager(LoggingMixin):
By processing them in separate processes, we can get parallelism and isolation
from potentially harmful user code.
"""
+ # TODO: Temporary until AIP-92 removes DB access from DagProcessorManager.
+ # The manager needs MetastoreBackend to retrieve connections from the database
+ # during bundle initialization (e.g., GitDagBundle.__init__ → GitHook needs git credentials).
+ # This marks the manager as "server" context so ensure_secrets_backend_loaded() provides
+ # MetastoreBackend instead of falling back to EnvironmentVariablesBackend only.
+ # Child parser processes explicitly override this by setting _AIRFLOW_PROCESS_CONTEXT=client
+ # in _parse_file_entrypoint() to prevent inheriting server privileges.
+ # Related: https://github.com/apache/airflow/pull/57459
+ os.environ["_AIRFLOW_PROCESS_CONTEXT"] = "server"
+
self.register_exit_signals()
self.log.info("Processing files using up to %s processes at a time ", self._parallelism)
diff --git a/airflow-core/src/airflow/dag_processing/processor.py b/airflow-core/src/airflow/dag_processing/processor.py
index 9e7215784f2..ac30dc03358 100644
--- a/airflow-core/src/airflow/dag_processing/processor.py
+++ b/airflow-core/src/airflow/dag_processing/processor.py
@@ -171,6 +171,10 @@ def _pre_import_airflow_modules(file_path: str, log: FilteringBoundLogger) -> No
def _parse_file_entrypoint():
+ # Mark as client-side (runs user DAG code)
+ # Prevents inheriting server context from parent DagProcessorManager
+ os.environ["_AIRFLOW_PROCESS_CONTEXT"] = "client"
+
import structlog
from airflow.sdk.execution_time import comms, task_runner