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
commit 1745ffc62af2bd962a83fede6c8af99277b04bf8 Author: vatsrahul1001 <[email protected]> AuthorDate: Tue Mar 3 19:15:47 2026 +0530 Add 3.2.0 release notes --- RELEASE_NOTES.rst | 229 +++++++++++++++++++++++ airflow-core/newsfragments/54505.significant.rst | 61 ------ airflow-core/newsfragments/56866.significant.rst | 38 ---- airflow-core/newsfragments/57069.significant.rst | 16 -- airflow-core/newsfragments/58337.feature.rst | 1 - airflow-core/newsfragments/58524.significant.rst | 7 - airflow-core/newsfragments/58992.significant.rst | 43 ----- airflow-core/newsfragments/59239.feature.rst | 1 - airflow-core/newsfragments/59780.significant.rst | 9 - airflow-core/newsfragments/59785.significant.rst | 10 - airflow-core/newsfragments/59835.significant.rst | 6 - airflow-core/newsfragments/59855.significant.rst | 1 - airflow-core/newsfragments/59880.bugfix.rst | 1 - airflow-core/newsfragments/59938.bugfix.rst | 1 - airflow-core/newsfragments/60268.improvement.rst | 1 - airflow-core/newsfragments/60619.significant.rst | 22 --- airflow-core/newsfragments/60803.significant.rst | 1 - airflow-core/newsfragments/60921.significant.rst | 51 ----- airflow-core/newsfragments/60951.significant.rst | 7 - 19 files changed, 229 insertions(+), 277 deletions(-) diff --git a/RELEASE_NOTES.rst b/RELEASE_NOTES.rst index 1accb35dfb9..5a2975ea267 100644 --- a/RELEASE_NOTES.rst +++ b/RELEASE_NOTES.rst @@ -24,6 +24,235 @@ .. towncrier release notes start +Airflow 3.2.0b1 (2026-03-03) +-------------------------- + +Significant Changes +^^^^^^^^^^^^^^^^^^^ + +- Move task-level exception imports into the Task SDK + + Airflow now sources task-facing exceptions (``AirflowSkipException``, ``TaskDeferred``, etc.) from + ``airflow.sdk.exceptions``. ``airflow.exceptions`` still exposes the same exceptions, but they are + proxies that emit ``DeprecatedImportWarning`` so Dag authors can migrate before the shim is removed. + + **What changed:** + + - Runtime code now consistently raises the SDK versions of task-level exceptions. + - The Task SDK redefines these classes so workers no longer depend on ``airflow-core`` at runtime. + - ``airflow.providers.common.compat.sdk`` centralizes compatibility imports for providers. + + **Behaviour changes:** + + - Sensors and other helpers that validate user input now raise ``ValueError`` (instead of + ``AirflowException``) when ``poke_interval``/ ``timeout`` arguments are invalid. + - Importing deprecated exception names from ``airflow.exceptions`` logs a warning directing users to + the SDK import path. + + **Exceptions now provided by ``airflow.sdk.exceptions``:** + + - ``AirflowException`` and ``AirflowNotFoundException`` + - ``AirflowRescheduleException`` and ``AirflowSensorTimeout`` + - ``AirflowSkipException``, ``AirflowFailException``, ``AirflowTaskTimeout``, ``AirflowTaskTerminated`` + - ``TaskDeferred``, ``TaskDeferralTimeout``, ``TaskDeferralError`` + - ``DagRunTriggerException`` and ``DownstreamTasksSkipped`` + - ``AirflowDagCycleException`` and ``AirflowInactiveAssetInInletOrOutletException`` + - ``ParamValidationError``, ``DuplicateTaskIdFound``, ``TaskAlreadyInTaskGroup``, ``TaskNotFound``, ``XComNotFound`` + - ``AirflowOptionalProviderFeatureException`` + + **Backward compatibility:** + + - Existing Dags/operators that still import from ``airflow.exceptions`` continue to work, though + they log warnings. + - Providers can rely on ``airflow.providers.common.compat.sdk`` to keep one import path that works + across supported Airflow versions. + + **Migration:** + + - Update custom operators, sensors, and extensions to import exception classes from + ``airflow.sdk.exceptions`` (or from the provider compat shim). + - Adjust custom validation code to expect ``ValueError`` for invalid sensor arguments if it + previously caught ``AirflowException``. + +- Support numeric multiplier values for retry_exponential_backoff parameter + + The ``retry_exponential_backoff`` parameter now accepts numeric values to specify custom exponential backoff multipliers for task retries. Previously, this parameter only accepted boolean values (``True`` or ``False``), with ``True`` using a hardcoded multiplier of ``2.0``. + + **New behavior:** + + - Numeric values (e.g., ``2.0``, ``3.5``) directly specify the exponential backoff multiplier + - ``retry_exponential_backoff=2.0`` doubles the delay between each retry attempt + - ``retry_exponential_backoff=0`` or ``False`` disables exponential backoff (uses fixed ``retry_delay``) + + **Backwards compatibility:** + + Existing DAGs using boolean values continue to work: + + - ``retry_exponential_backoff=True`` → converted to ``2.0`` (maintains original behavior) + - ``retry_exponential_backoff=False`` → converted to ``0.0`` (no exponential backoff) + + **API changes:** + + The REST API schema for ``retry_exponential_backoff`` has changed from ``type: boolean`` to ``type: number``. API clients must use numeric values (boolean values will be rejected). + + **Migration:** + + While boolean values in Python DAGs are automatically converted for backwards compatibility, we recommend updating to explicit numeric values for clarity: + + - Change ``retry_exponential_backoff=True`` → ``retry_exponential_backoff=2.0`` + - Change ``retry_exponential_backoff=False`` → ``retry_exponential_backoff=0`` + +- Move serialization/deserialization (serde) logic into Task SDK + + Airflow now sources serde logic from ``airflow.sdk.serde`` instead of + ``airflow.serialization.serde``. Serializer modules have moved from ``airflow.serialization.serializers.*`` + to ``airflow.sdk.serde.serializers.*``. The old import paths still work but emit ``DeprecatedImportWarning`` + to guide migration. The backward compatibility layer will be removed in Airflow 4. + + **What changed:** + + - Serialization/deserialization code moved from ``airflow-core`` to ``task-sdk`` package + - Serializer modules moved from ``airflow.serialization.serializers.*`` to ``airflow.sdk.serde.serializers.*`` + - New serializers should be added to ``airflow.sdk.serde.serializers.*`` namespace + + **Code interface changes:** + + - Import serializers from ``airflow.sdk.serde.serializers.*`` instead of ``airflow.serialization.serializers.*`` + - Import serialization functions from ``airflow.sdk.serde`` instead of ``airflow.serialization.serde`` + + **Backward compatibility:** + + - Existing serializers importing from ``airflow.serialization.serializers.*`` continue to work with deprecation warnings + - All existing serializers (builtin, datetime, pandas, numpy, etc.) are available at the new location + + **Migration:** + + - **For existing custom serializers**: Update imports to use ``airflow.sdk.serde.serializers.*`` + - **For new serializers**: Add them to ``airflow.sdk.serde.serializers.*`` namespace (e.g., create ``task-sdk/src/airflow/sdk/serde/serializers/your_serializer.py``) + +- Methods removed from PriorityWeightStrategy and TaskInstance + + On (experimental) class ``PriorityWeightStrategy``, functions ``serialize()`` + and ``deserialize()`` were never used anywhere, and have been removed. They + should not be relied on in user code. + + On class ``TaskInstance``, functions ``run()``, ``render_templates()``, and + private members related to them have been removed. The class has been + considered internal since 3.0, and should not be relied on in user code. (#59780) +- Modify the information returned by ``DagBag`` + + **New behavior:** + - ``DagBag`` now uses ``Path.relative_to`` for consistent cross-platform behavior. + - ``FileLoadStat`` now has two additional nullable fields: ``bundle_path`` and ``bundle_name``. + + **Backward compatibility:** + ``FileLoadStat`` will no longer produce paths beginning with ``/`` with the meaning of "relative to the dags folder". + This is a breaking change for any custom code that performs string-based path manipulations relying on this behavior. + Users are advised to update such code to use ``pathlib.Path``. (#59785) +- Methods removed from TaskInstance + + On class ``TaskInstance``, functions ``run()``, ``render_templates()``, + ``get_template_context()``, and private members related to them have been + removed. The class has been considered internal since 3.0, and should not be + relied on in user code. (#59835) +- Removed the redundant ``--conn-id`` option from the ``airflow connections list`` CLI command. Use ``airflow connections get`` instead. (#59855) +- Add operator-level ``render_template_as_native_obj`` override + + Operators can now override the DAG-level ``render_template_as_native_obj`` setting, + enabling fine-grained control over whether templates are rendered as native Python + types or strings on a per-task basis. Set ``render_template_as_native_obj=True`` or + ``False`` on any operator to override the DAG setting, or leave as ``None`` (default) + to inherit from the DAG. + +- Add gunicorn support for API server with zero-downtime worker recycling + + The API server now supports gunicorn as an alternative server with rolling worker restarts + to prevent memory accumulation in long-running processes. + + **Key Benefits:** + + * **Rolling worker restarts**: New workers spawn and pass health checks before old workers + are killed, ensuring zero downtime during worker recycling. + + * **Memory sharing**: Gunicorn uses preload + fork, so workers share memory via + copy-on-write. This significantly reduces total memory usage compared to uvicorn's + multiprocess mode where each worker loads everything independently. + + * **Correct FIFO signal handling**: Gunicorn's SIGTTOU kills the oldest worker (FIFO), + not the newest (LIFO), which is correct for rolling restarts. + + **Configuration:** + + .. code-block:: ini + + [api] + # Use gunicorn instead of uvicorn + server_type = gunicorn + + # Enable rolling worker restarts every 12 hours + worker_refresh_interval = 43200 + + # Restart workers one at a time + worker_refresh_batch_size = 1 + + Or via environment variables: + + .. code-block:: bash + + export AIRFLOW__API__SERVER_TYPE=gunicorn + export AIRFLOW__API__WORKER_REFRESH_INTERVAL=43200 + + **Requirements:** + + Install the gunicorn extra: ``pip install 'apache-airflow-core[gunicorn]'`` + + **Note on uvicorn (default):** + + The default uvicorn mode does not support rolling worker restarts because: + + 1. With workers=1, there is no master process to send signals to + 2. uvicorn's SIGTTOU kills the newest worker (LIFO), defeating rolling restart purposes + 3. Each uvicorn worker loads everything independently with no memory sharing + + If you need worker recycling or memory-efficient multi-worker deployment, use gunicorn. (#60921) +- Improved performance of rendered task instance fields cleanup for DAGs with many mapped tasks (~42x faster). + + The config ``max_num_rendered_ti_fields_per_task`` is renamed to ``num_dag_runs_to_retain_rendered_fields`` + (old name still works with deprecation warning). + + Retention is now based on the N most recent dag runs rather than N most recent task executions, + which may result in fewer records retained for conditional/sparse tasks. (#60951) +- AuthManager Backfill permissions are now handled by the ``requires_access_dag`` on the ``DagAccessEntity.Run`` + + ``is_authorized_backfill`` of the ``BaseAuthManager`` interface has been removed. Core will no longer call this method and their + provider counterpart implementation will be marked as deprecated. + Permissions for backfill operations are now checked against the ``DagAccessEntity.Run`` permission using the existing + ``requires_access_dag`` decorator. In other words, if a user has permission to run a DAG, they can perform backfill operations on it. + + Please update your security policies to ensure that users who need to perform backfill operations have the appropriate ``DagAccessEntity.Run`` permissions. (Users + having the Backfill permissions without having the DagRun ones will no longer be able to perform backfill operations without any update) + + +Features +^^^^^^^^ + +- Enable FIPS Support by making Python LTO configurable via ``PYTHON_LTO`` build argument (#58337) +- Support for task queue-based Trigger assignment to specific Triggerer hosts via the new ``--queues`` CLI option for the ``trigger`` command. (#59239) + + +Improvements +^^^^^^^^^^^^ + +- The ``PythonOperator`` parameter ``python_callable`` now also supports async callables in Airflow 3.2, allowing users to run async def functions without manually managing an event loop. (#60268) + + +Bug Fixes +^^^^^^^^^ + +- Always mask sensitive configuration values in public config APIs and treat the deprecated ``non-sensitive-only`` value as ``True``. (#59880) +- Pool names with invalid characters for stats reporting are now automatically normalized (invalid characters replaced with underscores) when emitting metrics, preventing ``InvalidStatsNameException``. A warning is logged when normalization occurs, suggesting the pool be renamed. (#59938) + + Airflow 3.1.8 (2026-03-11) -------------------------- diff --git a/airflow-core/newsfragments/54505.significant.rst b/airflow-core/newsfragments/54505.significant.rst deleted file mode 100644 index 3289308fa0f..00000000000 --- a/airflow-core/newsfragments/54505.significant.rst +++ /dev/null @@ -1,61 +0,0 @@ -Move task-level exception imports into the Task SDK - -Airflow now sources task-facing exceptions (``AirflowSkipException``, ``TaskDeferred``, etc.) from -``airflow.sdk.exceptions``. ``airflow.exceptions`` still exposes the same exceptions, but they are -proxies that emit ``DeprecatedImportWarning`` so Dag authors can migrate before the shim is removed. - -**What changed:** - -- Runtime code now consistently raises the SDK versions of task-level exceptions. -- The Task SDK redefines these classes so workers no longer depend on ``airflow-core`` at runtime. -- ``airflow.providers.common.compat.sdk`` centralizes compatibility imports for providers. - -**Behaviour changes:** - -- Sensors and other helpers that validate user input now raise ``ValueError`` (instead of - ``AirflowException``) when ``poke_interval``/ ``timeout`` arguments are invalid. -- Importing deprecated exception names from ``airflow.exceptions`` logs a warning directing users to - the SDK import path. - -**Exceptions now provided by ``airflow.sdk.exceptions``:** - -- ``AirflowException`` and ``AirflowNotFoundException`` -- ``AirflowRescheduleException`` and ``AirflowSensorTimeout`` -- ``AirflowSkipException``, ``AirflowFailException``, ``AirflowTaskTimeout``, ``AirflowTaskTerminated`` -- ``TaskDeferred``, ``TaskDeferralTimeout``, ``TaskDeferralError`` -- ``DagRunTriggerException`` and ``DownstreamTasksSkipped`` -- ``AirflowDagCycleException`` and ``AirflowInactiveAssetInInletOrOutletException`` -- ``ParamValidationError``, ``DuplicateTaskIdFound``, ``TaskAlreadyInTaskGroup``, ``TaskNotFound``, ``XComNotFound`` -- ``AirflowOptionalProviderFeatureException`` - -**Backward compatibility:** - -- Existing Dags/operators that still import from ``airflow.exceptions`` continue to work, though - they log warnings. -- Providers can rely on ``airflow.providers.common.compat.sdk`` to keep one import path that works - across supported Airflow versions. - -**Migration:** - -- Update custom operators, sensors, and extensions to import exception classes from - ``airflow.sdk.exceptions`` (or from the provider compat shim). -- Adjust custom validation code to expect ``ValueError`` for invalid sensor arguments if it - previously caught ``AirflowException``. - -* Types of change - - * [ ] Dag changes - * [ ] Config changes - * [ ] API changes - * [ ] CLI changes - * [x] Behaviour changes - * [ ] Plugin changes - * [ ] Dependency changes - * [x] Code interface changes - -* Migration rules needed - - * Import task-level exceptions such as ``AirflowSkipException``, ``TaskDeferred``, - ``AirflowFailException``, etc. from ``airflow.sdk.exceptions`` instead of ``airflow.exceptions``. - * Update custom sensors/operators that validated arguments by catching ``AirflowException`` to - expect ``ValueError`` for invalid ``poke_interval`` / ``timeout`` inputs. diff --git a/airflow-core/newsfragments/56866.significant.rst b/airflow-core/newsfragments/56866.significant.rst deleted file mode 100644 index ac3806334a5..00000000000 --- a/airflow-core/newsfragments/56866.significant.rst +++ /dev/null @@ -1,38 +0,0 @@ -Support numeric multiplier values for retry_exponential_backoff parameter - -The ``retry_exponential_backoff`` parameter now accepts numeric values to specify custom exponential backoff multipliers for task retries. Previously, this parameter only accepted boolean values (``True`` or ``False``), with ``True`` using a hardcoded multiplier of ``2.0``. - -**New behavior:** - -- Numeric values (e.g., ``2.0``, ``3.5``) directly specify the exponential backoff multiplier -- ``retry_exponential_backoff=2.0`` doubles the delay between each retry attempt -- ``retry_exponential_backoff=0`` or ``False`` disables exponential backoff (uses fixed ``retry_delay``) - -**Backwards compatibility:** - -Existing DAGs using boolean values continue to work: - -- ``retry_exponential_backoff=True`` → converted to ``2.0`` (maintains original behavior) -- ``retry_exponential_backoff=False`` → converted to ``0.0`` (no exponential backoff) - -**API changes:** - -The REST API schema for ``retry_exponential_backoff`` has changed from ``type: boolean`` to ``type: number``. API clients must use numeric values (boolean values will be rejected). - -**Migration:** - -While boolean values in Python DAGs are automatically converted for backwards compatibility, we recommend updating to explicit numeric values for clarity: - -- Change ``retry_exponential_backoff=True`` → ``retry_exponential_backoff=2.0`` -- Change ``retry_exponential_backoff=False`` → ``retry_exponential_backoff=0`` - -* Types of change - - * [ ] Dag changes - * [ ] Config changes - * [x] API changes - * [ ] CLI changes - * [x] Behaviour changes - * [ ] Plugin changes - * [ ] Dependency changes - * [ ] Code interface changes diff --git a/airflow-core/newsfragments/57069.significant.rst b/airflow-core/newsfragments/57069.significant.rst deleted file mode 100644 index a4d1c22bb7a..00000000000 --- a/airflow-core/newsfragments/57069.significant.rst +++ /dev/null @@ -1,16 +0,0 @@ -Git provider: Remove '.git' folder from versions in GitDagBundle - -A new option(``prune_dotgit_folder``) has been added to the GitDagBundle to remove ``.git`` from -versioned bundles by default to reduce disk usage; set prune_dotgit_folder=False to keep -repo metadata in the dag bundle's versions folders. - -* Types of change - - * [ ] Dag changes - * [ ] Config changes - * [ ] API changes - * [ ] CLI changes - * [x] Behaviour changes - * [ ] Plugin changes - * [ ] Dependency changes - * [ ] Code interface changes diff --git a/airflow-core/newsfragments/58337.feature.rst b/airflow-core/newsfragments/58337.feature.rst deleted file mode 100644 index e2720735819..00000000000 --- a/airflow-core/newsfragments/58337.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Enable FIPS Support by making Python LTO configurable via ``PYTHON_LTO`` build argument diff --git a/airflow-core/newsfragments/58524.significant.rst b/airflow-core/newsfragments/58524.significant.rst deleted file mode 100644 index ef94f296dcf..00000000000 --- a/airflow-core/newsfragments/58524.significant.rst +++ /dev/null @@ -1,7 +0,0 @@ -FastAPI dependency is updated and lower bound set to ``0.121.0`` - -Airflow now requires FastAPI ``>=0.121.0`` and removes the previous upper -constraint. This aligns with FastAPI's new dependency lifecycle scopes -(e.g. request/function) that change how dependencies with ``yield`` are -exited. -See `FastAPI PR #14262 <https://github.com/fastapi/fastapi/pull/14262>`_. diff --git a/airflow-core/newsfragments/58992.significant.rst b/airflow-core/newsfragments/58992.significant.rst deleted file mode 100644 index 22eb8fe6d8a..00000000000 --- a/airflow-core/newsfragments/58992.significant.rst +++ /dev/null @@ -1,43 +0,0 @@ -Move serialization/deserialization (serde) logic into Task SDK - -Airflow now sources serde logic from ``airflow.sdk.serde`` instead of -``airflow.serialization.serde``. Serializer modules have moved from ``airflow.serialization.serializers.*`` -to ``airflow.sdk.serde.serializers.*``. The old import paths still work but emit ``DeprecatedImportWarning`` -to guide migration. The backward compatibility layer will be removed in Airflow 4. - -**What changed:** - -- Serialization/deserialization code moved from ``airflow-core`` to ``task-sdk`` package -- Serializer modules moved from ``airflow.serialization.serializers.*`` to ``airflow.sdk.serde.serializers.*`` -- New serializers should be added to ``airflow.sdk.serde.serializers.*`` namespace - -**Code interface changes:** - -- Import serializers from ``airflow.sdk.serde.serializers.*`` instead of ``airflow.serialization.serializers.*`` -- Import serialization functions from ``airflow.sdk.serde`` instead of ``airflow.serialization.serde`` - -**Backward compatibility:** - -- Existing serializers importing from ``airflow.serialization.serializers.*`` continue to work with deprecation warnings -- All existing serializers (builtin, datetime, pandas, numpy, etc.) are available at the new location - -**Migration:** - -- **For existing custom serializers**: Update imports to use ``airflow.sdk.serde.serializers.*`` -- **For new serializers**: Add them to ``airflow.sdk.serde.serializers.*`` namespace (e.g., create ``task-sdk/src/airflow/sdk/serde/serializers/your_serializer.py``) - -* Types of change - - * [ ] Dag changes - * [ ] Config changes - * [ ] API changes - * [ ] CLI changes - * [x] Behaviour changes - * [ ] Plugin changes - * [ ] Dependency changes - * [x] Code interface changes - -* Migration rules needed - - * Import serializers from ``airflow.sdk.serde.serializers.*`` instead of ``airflow.serialization.serializers.*`` - * Add new custom serializers to ``airflow.sdk.serde.serializers.*`` namespace diff --git a/airflow-core/newsfragments/59239.feature.rst b/airflow-core/newsfragments/59239.feature.rst deleted file mode 100644 index e4292a4b906..00000000000 --- a/airflow-core/newsfragments/59239.feature.rst +++ /dev/null @@ -1 +0,0 @@ -Support for task queue-based Trigger assignment to specific Triggerer hosts via the new ``--queues`` CLI option for the ``trigger`` command. diff --git a/airflow-core/newsfragments/59780.significant.rst b/airflow-core/newsfragments/59780.significant.rst deleted file mode 100644 index fb989784a25..00000000000 --- a/airflow-core/newsfragments/59780.significant.rst +++ /dev/null @@ -1,9 +0,0 @@ -Methods removed from PriorityWeightStrategy and TaskInstance - -On (experimental) class ``PriorityWeightStrategy``, functions ``serialize()`` -and ``deserialize()`` were never used anywhere, and have been removed. They -should not be relied on in user code. - -On class ``TaskInstance``, functions ``run()``, ``render_templates()``, and -private members related to them have been removed. The class has been -considered internal since 3.0, and should not be relied on in user code. diff --git a/airflow-core/newsfragments/59785.significant.rst b/airflow-core/newsfragments/59785.significant.rst deleted file mode 100644 index f92ccbc0122..00000000000 --- a/airflow-core/newsfragments/59785.significant.rst +++ /dev/null @@ -1,10 +0,0 @@ -Modify the information returned by ``DagBag`` - -**New behavior:** -- ``DagBag`` now uses ``Path.relative_to`` for consistent cross-platform behavior. -- ``FileLoadStat`` now has two additional nullable fields: ``bundle_path`` and ``bundle_name``. - -**Backward compatibility:** -``FileLoadStat`` will no longer produce paths beginning with ``/`` with the meaning of "relative to the dags folder". -This is a breaking change for any custom code that performs string-based path manipulations relying on this behavior. -Users are advised to update such code to use ``pathlib.Path``. diff --git a/airflow-core/newsfragments/59835.significant.rst b/airflow-core/newsfragments/59835.significant.rst deleted file mode 100644 index 02b9d709a49..00000000000 --- a/airflow-core/newsfragments/59835.significant.rst +++ /dev/null @@ -1,6 +0,0 @@ -Methods removed from TaskInstance - -On class ``TaskInstance``, functions ``run()``, ``render_templates()``, -``get_template_context()``, and private members related to them have been -removed. The class has been considered internal since 3.0, and should not be -relied on in user code. diff --git a/airflow-core/newsfragments/59855.significant.rst b/airflow-core/newsfragments/59855.significant.rst deleted file mode 100644 index 94507ca9e3c..00000000000 --- a/airflow-core/newsfragments/59855.significant.rst +++ /dev/null @@ -1 +0,0 @@ -Removed the redundant ``--conn-id`` option from the ``airflow connections list`` CLI command. Use ``airflow connections get`` instead. diff --git a/airflow-core/newsfragments/59880.bugfix.rst b/airflow-core/newsfragments/59880.bugfix.rst deleted file mode 100644 index e1c35a9d640..00000000000 --- a/airflow-core/newsfragments/59880.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Always mask sensitive configuration values in public config APIs and treat the deprecated ``non-sensitive-only`` value as ``True``. diff --git a/airflow-core/newsfragments/59938.bugfix.rst b/airflow-core/newsfragments/59938.bugfix.rst deleted file mode 100644 index db9ecabfc0c..00000000000 --- a/airflow-core/newsfragments/59938.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Pool names with invalid characters for stats reporting are now automatically normalized (invalid characters replaced with underscores) when emitting metrics, preventing ``InvalidStatsNameException``. A warning is logged when normalization occurs, suggesting the pool be renamed. diff --git a/airflow-core/newsfragments/60268.improvement.rst b/airflow-core/newsfragments/60268.improvement.rst deleted file mode 100644 index 8c7e92b8f0d..00000000000 --- a/airflow-core/newsfragments/60268.improvement.rst +++ /dev/null @@ -1 +0,0 @@ -The ``PythonOperator`` parameter ``python_callable`` now also supports async callables in Airflow 3.2, allowing users to run async def functions without manually managing an event loop. diff --git a/airflow-core/newsfragments/60619.significant.rst b/airflow-core/newsfragments/60619.significant.rst deleted file mode 100644 index 2d975f624bd..00000000000 --- a/airflow-core/newsfragments/60619.significant.rst +++ /dev/null @@ -1,22 +0,0 @@ -Add operator-level ``render_template_as_native_obj`` override - -Operators can now override the DAG-level ``render_template_as_native_obj`` setting, -enabling fine-grained control over whether templates are rendered as native Python -types or strings on a per-task basis. Set ``render_template_as_native_obj=True`` or -``False`` on any operator to override the DAG setting, or leave as ``None`` (default) -to inherit from the DAG. - -* Types of change - - * [ ] Dag changes - * [ ] Config changes - * [ ] API changes - * [ ] CLI changes - * [x] Behaviour changes - * [ ] Plugin changes - * [ ] Dependency changes - * [ ] Code interface changes - -* Migration rules needed - - * None - this is a new optional feature with backwards-compatible defaults diff --git a/airflow-core/newsfragments/60803.significant.rst b/airflow-core/newsfragments/60803.significant.rst deleted file mode 100644 index 1054258ad38..00000000000 --- a/airflow-core/newsfragments/60803.significant.rst +++ /dev/null @@ -1 +0,0 @@ -Move ``upstream_map_indexes`` computation from API server to Task SDK, reducing memory usage on task start by eliminating ``SerializedDAG`` loads. diff --git a/airflow-core/newsfragments/60921.significant.rst b/airflow-core/newsfragments/60921.significant.rst deleted file mode 100644 index c97bbcdf97a..00000000000 --- a/airflow-core/newsfragments/60921.significant.rst +++ /dev/null @@ -1,51 +0,0 @@ -Add gunicorn support for API server with zero-downtime worker recycling - -The API server now supports gunicorn as an alternative server with rolling worker restarts -to prevent memory accumulation in long-running processes. - -**Key Benefits:** - -* **Rolling worker restarts**: New workers spawn and pass health checks before old workers - are killed, ensuring zero downtime during worker recycling. - -* **Memory sharing**: Gunicorn uses preload + fork, so workers share memory via - copy-on-write. This significantly reduces total memory usage compared to uvicorn's - multiprocess mode where each worker loads everything independently. - -* **Correct FIFO signal handling**: Gunicorn's SIGTTOU kills the oldest worker (FIFO), - not the newest (LIFO), which is correct for rolling restarts. - -**Configuration:** - -.. code-block:: ini - - [api] - # Use gunicorn instead of uvicorn - server_type = gunicorn - - # Enable rolling worker restarts every 12 hours - worker_refresh_interval = 43200 - - # Restart workers one at a time - worker_refresh_batch_size = 1 - -Or via environment variables: - -.. code-block:: bash - - export AIRFLOW__API__SERVER_TYPE=gunicorn - export AIRFLOW__API__WORKER_REFRESH_INTERVAL=43200 - -**Requirements:** - -Install the gunicorn extra: ``pip install 'apache-airflow-core[gunicorn]'`` - -**Note on uvicorn (default):** - -The default uvicorn mode does not support rolling worker restarts because: - -1. With workers=1, there is no master process to send signals to -2. uvicorn's SIGTTOU kills the newest worker (LIFO), defeating rolling restart purposes -3. Each uvicorn worker loads everything independently with no memory sharing - -If you need worker recycling or memory-efficient multi-worker deployment, use gunicorn. diff --git a/airflow-core/newsfragments/60951.significant.rst b/airflow-core/newsfragments/60951.significant.rst deleted file mode 100644 index 1f203b34a62..00000000000 --- a/airflow-core/newsfragments/60951.significant.rst +++ /dev/null @@ -1,7 +0,0 @@ -Improved performance of rendered task instance fields cleanup for DAGs with many mapped tasks (~42x faster). - -The config ``max_num_rendered_ti_fields_per_task`` is renamed to ``num_dag_runs_to_retain_rendered_fields`` -(old name still works with deprecation warning). - -Retention is now based on the N most recent dag runs rather than N most recent task executions, -which may result in fewer records retained for conditional/sparse tasks.
