Apache Airflow 2.3.0stable Released May 01, 2022
Impact Score: 5/10

Apache Airflow 2.3.0

Source available โ€” automated, not human-reviewed

Component: airflow ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Compatibility not verified โ€” check source notes
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Apache Airflow 2.3.0. Source highlight: Add dynamic task mapping (https://github.com/apache/airflow/pulls?q=is%3Apr+is%3Amerged+label%3AAIP-42+milestone%3A%22Airflow+2.3.0%22)

Who Does This Impact? (Role-Based Analysis)

๐Ÿ’ป Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

๐Ÿ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

โš™๏ธ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

โœจ New Features & Capabilities (6)

  • Add dynamic task mapping (https://github.com/apache/airflow/pulls?q=is%3Apr+is%3Amerged+label%3AAIP-42+milestone%3A%22Airflow+2.3.0%22)
  • New Grid View replaces Tree View (#18675)
  • Templated ``requirements.txt`` in Python Operators (#17349)
  • Allow reuse of decorated tasks (#22941)
  • Move the database configuration to a new section (#22284)
  • Add ``SmoothOperator`` (#22813)

โšก Performance & Enhancements (6)

  • Show schedule_interval/timetable description in UI (#16931)
  • Enable use of custom conn extra fields without prefix (#22607)
  • Initialize finished counter at zero (#23080)
  • Meaningful error message in resolve_template_files (#23027)
  • Update ImportError items instead of deleting and recreating them (#22928)
  • Support importing connections from files with ".yml" extension (#22872)

๐Ÿ”ง Bug Fixes & Patches (6)

  • Pickle dag exception string fix (#22760)
  • Fix TaskDecorator type hints (#21881)
  • Use inherited 'trigger_tasks' method (#23016)
  • In DAG dependency detector, use class type instead of class name (#21706)
  • Fix tasks being wrongly skipped by schedule_after_task_execution (#23181)
  • Fix X-Frame enabled behaviour (#23222)
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
# New Features - Add dynamic task mapping (https://github.com/apache/airflow/pulls?q=is%3Apr+is%3Amerged+label%3AAIP-42+milestone%3A%22Airflow+2.3.0%22) - New Grid View replaces Tree View (#18675) - Templated ``requirements.txt`` in Python Operators (#17349) - Allow reuse of decorated tasks (#22941) - Move the database configuration to a new section (#22284) - Add ``SmoothOperator`` (#22813) - Make operator's ``execution_timeout`` configurable (#22389) - Events Timetable (#22332) - Support dag serialization with custom ``ti_deps`` rules (#22698) - Support log download in task log view (#22804) - support for continue backfill on failures (#22697) - Add ``dag-processor`` cli command (#22305) - Add possibility to create users in LDAP mode (#22619) - Add ``ignore_first_depends_on_past`` for scheduled jobs (#22491) - Update base sensor operator to support XCOM return value (#20656) - Add an option for run id in the ui trigger screen (#21851) - Enable JSON serialization for connections (#19857) - Add REST API endpoint for bulk update of DAGs (#19758) - Add queue button to click-on-DagRun interface. (#21555) - Add ``list-import-errors`` to ``airflow dags`` command (#22084) - Store callbacks in database if ``standalone_dag_processor`` config is True. (#21731) - Add LocalKubernetesExecutor (#19729) - Add ``celery.task_timeout_error`` metric (#21602) - Airflow ``db downgrade`` cli command (#21596) - Add ``ALL_SKIPPED`` trigger rule (#21662) - Add ``db clean`` CLI command for purging old data (#20838) - Add ``celery_logging_level`` (#21506) - Support different timeout value for dag file parsing (#21501) - Support generating SQL script for upgrades (#20962) - Add option to compress Serialized dag data (#21332) - Branch python operator decorator (#20860) - Add Audit Log View to Dag View (#20733) - Add missing StatsD metric for failing SLA Callback notification (#20924) - Add ``ShortCircuitOperator`` configurability for respecting downstream trigger rules (#20044) - Allow using Markup in page title in Webserver (#20888) - Add Listener Plugin API that tracks TaskInstance state changes (#20443) - Add context var hook to inject more env vars (#20361) - Add a button to set all tasks to skipped (#20455) - Cleanup pending pods (#20438) - Add config to warn public deployment exposure in UI (#18557) - Log filename template records (#20165) - Added windows extensions (#16110) - Showing approximate time until next dag_run in Airflow (#20273) - Extend config window on UI (#20052) - Add show dag dependencies feature to CLI (#19985) - Add cli command for 'airflow dags reserialize` (#19471) - Add missing description field to Pool schema(REST API) (#19841) - Introduce DagRun action to change state to queued. (#19353) - Add DAG run details page (#19705) - Add role export/import to cli tools (#18916) - Adding ``dag_id_pattern`` parameter to the ``/dags`` endpoint (#18924) # Improvements - Show schedule_interval/timetable description in UI (#16931) - Added column duration to DAG runs view (#19482) - Enable use of custom conn extra fields without prefix (#22607) - Initialize finished counter at zero (#23080) - Improve logging of optional provider features messages (#23037) - Meaningful error message in resolve_template_files (#23027) - Update ImportError items instead of deleting and recreating them (#22928) - Add option ``--skip-init`` to db reset command (#22989) - Support importing connections from files with ".yml" extension (#22872) - Support glob syntax in ``.airflowignore`` files (#21392) (#22051) - Hide pagination when data is a single page (#22963) - Support for sorting DAGs in the web UI (#22671) - Speed up ``has_access`` decorator by ~200ms (#22858) - Add XComArg to lazy-imported list of Airflow module (#22862) - Add more fields to REST API dags/dag_id/details endpoint (#22756) - Don't show irrelevant/duplicated/"internal" Task attrs in UI (#22812) - No need to load whole ti in current_state (#22764) - Pickle dag exception string fix (#22760) - Better verification of Localexecutor's parallelism option (#22711) - log backfill exceptions to sentry (#22704) - retry commit on MySQL deadlocks during backfill (#22696) - Add more fields to REST API get DAG(dags/dag_id) endpoint (#22637) - Use timetable to generate planned days for current year (#22055) - Disable connection pool for celery worker (#22493) - Make date picker label visible in trigger dag view (#22379) - Expose ``try_number`` in airflow vars (#22297) - Add generic connection type (#22310) - Add a few more fields to the taskinstance finished log message (#22262) - Pause auto-refresh if scheduler isn't running (#22151) - Show DagModel details. (#21868) - Add pip_install_options to PythonVirtualenvOperator (#22158) - Show import error for ``airflow dags list`` CLI command (#21991) - Pause auto-refresh when page is hidden (#21904) - Default args type check (#21809) - Enhance magic methods on XComArg for UX (#21882) - py files don't have to be checked ``is_zipfiles`` in refresh_dag (#21926) - Fix TaskDecorator type hints (#21881) - Add 'Show record' option for variables (#21342) - Use DB where possible for quicker ``airflow dag`` subcommands (#21793) - REST API: add rendered fields in task instance. (#21741) - Change the default auth backend to session (#21640) - Don't check if ``py`` DAG files are zipped during parsing (#21538) - Switch XCom implementation to use ``run_id`` (#20975) - Action log on Browse Views (#21569) - Implement multiple API auth backends (#21472) - Change logging level details of connection info in ``get_connection()`` (#21162) - Support mssql in airflow db shell (#21511) - Support config ``worker_enable_remote_control`` for celery (#21507) - Log memory usage in ``CgroupTaskRunner`` (#21481) - Modernize DAG-related URL routes and rename "tree" to "grid" (#20730) - Move Zombie detection to ``SchedulerJob`` (#21181) - Improve speed to run ``airflow`` by 6x (#21438) - Add more SQL template fields renderers (#21237) - Simplify fab has access lookup (#19294) - Log context only for default method (#21244) - Log trigger status only if at least one is running (#21191) - Add optional features in providers. (#21074) - Better multiple_outputs inferral for @task.python (#20800) - Improve handling of string type and non-attribute ``template_fields`` (#21054) - Remove un-needed deps/version requirements (#20979) - Correctly specify overloads for TaskFlow API for type-hinting (#20933) - Introduce notification_sent to SlaMiss view (#20923) - Rewrite the task decorator as a composition (#20868) - Add "Greater/Smaller than or Equal" to filters in the browse views (#20602) (#20798) - Rewrite DAG run retrieval in task command (#20737) - Speed up creation of DagRun for large DAGs (5k+ tasks) by 25-130% (#20722) - Make native environment Airflow-flavored like sandbox (#20704) - Better error when param value has unexpected type (#20648) - Add filter by state in DagRun REST API (List Dag Runs) (#20485) - Prevent exponential memory growth in Tasks with custom logging handler (#20541) - Set default logger in logging Mixin (#20355) - Reduce deprecation warnings from www (#20378) - Add hour and minute to time format on x-axis of all charts using nvd3.lineChart (#20002) - Add specific warning when Task asks for more slots than pool defined with (#20178) - UI: Update duration column for better human readability (#20112) - Use Viewer role as example public role (#19215) - Properly implement DAG param dict copying (#20216) - ``ShortCircuitOperator`` push XCom by returning python_callable result (#20071) - Add clear logging to tasks killed due to a Dagrun timeout (#19950) - Change log level for Zombie detection messages (#20204) - Better confirmation prompts (#20183) - Only execute TIs of running DagRuns (#20182) - Check and run migration in commands if necessary (#18439) - Log only when Zombies exists (#20118) - Increase length of the email and username (#19932) - Add more filtering options for TI's in the UI (#19910) - Dynamically enable "Test Connection" button by connection type (#19792) - Avoid littering postgres server logs with "could not obtain lock" with HA schedulers (#19842) - Renamed ``Connection.get_hook`` parameter to make it the same as in ``SqlSensor`` and ``SqlOperator``. (#19849) - Add hook_params in SqlSensor using the latest changes from PR #18718. (#18431) - Speed up webserver boot time by delaying provider initialization (#19709) - Configurable logging of ``XCOM`` value in PythonOperator (#19378) - Minimize production js files (#19658) - Add ``hook_params`` in ``BaseSqlOperator`` (#18718) - Add missing "end_date" to hash components (#19281) - More friendly output of the airflow plugins command + add timetables (#19298) - Add sensor default timeout config (#19119) - Update ``taskinstance`` REST API schema to include dag_run_id field (#19105) - Adding feature in bash operator to append the user defined env variable to system env variable (#18944) - Duplicate Connection: Added logic to query if a connection id exists before creating one (#18161) # Bug Fixes - Use inherited 'trigger_tasks' method (#23016) - In DAG dependency detector, use class type instead of class name (#21706) - Fix tasks being wrongly skipped by schedule_after_task_execution (#23181) - Fix X-Frame enabled behaviour (#23222) - Allow ``extra`` to be nullable in connection payload as per schema(REST API). (#23183) - Fix ``dag_id`` extraction for dag level access checks in web ui (#23015) - Fix timezone display for logs on UI (#23075) - Include message in graph errors (#23021) - Change trigger dropdown left position (#23013) - Don't add planned tasks for legacy DAG runs (#23007) - Add dangling rows check for TaskInstance references (#22924) - Validate the input params in connection ``CLI`` command (#22688) - Fix trigger event payload is not persisted in db (#22944) - Drop "airflow moved" tables in command ``db reset`` (#22990) - Add max width to task group tooltips (#22978) - Add template support for ``external_task_ids``. (#22809) - Allow ``DagParam`` to hold falsy values (#22964) - Fix regression in pool metrics (#22939) - Priority order tasks even when using pools (#22483) - Do not clear XCom when resuming from deferral (#22932) - Handle invalid JSON metadata in ``get_logs_with_metadata endpoint``. (#22898) - Fix pre-upgrade check for rows dangling w.r.t. dag_run (#22850) - Fixed backfill interference with scheduler (#22701) - Support conf param override for backfill runs (#22837) - Correctly interpolate pool name in ``PoolSlotsAvailableDep`` statues (#22807) - Fix ``email_on_failure`` with ``render_template_as_native_obj`` (#22770) - Fix processor cleanup on ``DagFileProcessorManager`` (#22685) - Prevent meta name clash for task instances (#22783) - remove json parse for gantt chart (#22780) - Check for missing dagrun should know version (#22752) - Fixes ``ScheduleInterval`` spec (#22635) - Fixing task status for non-running and non-committed tasks (#22410) - Do not log the hook connection details even at DEBUG level (#22627) - Stop crashing when empty logs are received from kubernetes client (#22566) - Fix bugs about timezone change (#22525) - Fix entire DAG stops when one task has end_date (#20920) - Use logger to print message during task execution. (#22488) - Make sure finalizers are not skipped during exception handling (#22475) - update smart sensor docs and minor fix on ``is_smart_sensor_compatible()`` (#22386) - Fix ``run_id`` k8s and elasticsearch compatibility with Airflow 2.1 (#22385) - Allow to ``except_skip`` None on ``BranchPythonOperator`` (#20411) - Fix incorrect datetime details (DagRun views) (#21357) - Remove incorrect deprecation warning in secrets backend (#22326) - Remove ``RefreshConfiguration`` workaround for K8s token refreshing (#20759) - Masking extras in GET ``/connections/<connection>`` endpoint (#22227) - Set ``queued_dttm`` when submitting task to directly to executor (#22259) - Addressed some issues in the tutorial mentioned in discussion #22233 (#22236) - Change default python executable to python3 for docker decorator (#21973) - Don't validate that Params are JSON when NOTSET (#22000) - Add per-DAG delete permissions (#21938) - Fix handling some None parameters in kubernetes 23 libs. (#21905) - Fix handling of empty (None) tags in ``bulk_write_to_db`` (#21757) - Fix DAG date range bug (#20507) - Removed ``request.referrer`` from views.py (#21751) - Make ``DbApiHook`` use ``get_uri`` from Connection (#21764) - Fix some migrations (#21670) - [de]serialize resources on task correctly (#21445) - Add params ``dag_id``, ``task_id`` etc to ``XCom.serialize_value`` (#19505) - Update test connection functionality to use custom form fields (#21330) - fix all "high" npm vulnerabilities (#21526) - Fix bug incorrectly removing action from role, rather than permission. (#21483) - Fix relationship join bug in FAB/SecurityManager with SQLA 1.4 (#21296) - Use Identity instead of Sequence in SQLAlchemy 1.4 for MSSQL (#21238) - Ensure ``on_task_instance_running`` listener can get at task (#21157) - Return to the same place when triggering a DAG (#20955) - Fix task ID deduplication in ``@task_group`` (#20870) - Add downgrade to some FAB migrations (#20874) - Only validate Params when DAG is triggered (#20802) - Fix ``airflow trigger`` cli (#20781) - Fix task instances iteration in a pool to prevent blocking (#20816) - Allow depending to a ``@task_group`` as a whole (#20671) - Use original task's ``start_date`` if a task continues after deferral (#20062) - Disabled edit button in task instances list view page (#20659) - Fix a package name import error (#20519) (#20519) - Remove ``execution_date`` label when get cleanup pods list (#20417) - Remove unneeded FAB REST API endpoints (#20487) - Fix parsing of Cloudwatch log group arn containing slashes (#14667) (#19700) - Sanity check for MySQL's TIMESTAMP column (#19821) - Allow using default celery command group with executors subclassed from Celery-based executors. (#18189) - Move ``class_permission_name`` to mixin so it applies to all classes (#18749) - Adjust trimmed_pod_id and replace '.' with '-' (#19036) - Pass custom_headers to send_email and send_email_smtp (#19009) - Ensure ``catchup=False`` is used in example dags (#19396) - Edit permalinks in OpenApi description file (#19244) - Navigate directly to DAG when selecting from search typeahead list (#18991) - [Minor] Fix padding on home page (#19025) # Doc only changes - Update doc for DAG file processing (#23209) - Replace changelog/updating with release notes and ``towncrier`` now (#22003) - Fix wrong reference in tracking-user-activity.rst (#22745) - Remove references to ``rbac = True`` from docs (#22725) - Doc: Update description for executor-bound dependencies (#22601) - Update check-health.rst (#22372) - Stronger language about Docker Compose customizability (#22304) - Update logging-tasks.rst (#22116) - Add example config of ``sql_alchemy_connect_args`` (#22045) - Update best-practices.rst (#22053) - Add information on DAG pausing/deactivation/deletion (#22025) - Add brief examples of integration test dags you might want (#22009) - Run inclusive language check on CHANGELOG (#21980) - Add detailed email docs for Sendgrid (#21958) - Add docs for ``db upgrade`` / ``db downgrade`` (#21879) - Update modules_management.rst (#21889) - Fix UPDATING section on SqlAlchemy 1.4 scheme changes (#21887) - Update TaskFlow tutorial doc to show how to pass "operator-level" args. (#21446) - Fix doc - replace decreasing by increasing (#21805) - Add another way to dynamically generate DAGs to docs (#21297) - Add extra information about time synchronization needed (#21685) - Update debug.rst docs (#21246) - Replaces the usage of ``postgres://`` with ``postgresql://`` (#21205) - Fix task execution process in ``CeleryExecutor`` docs (#20783) # Misc/Internal - Bring back deprecated security manager functions (#23243) - Replace usage of ``DummyOperator`` with ``EmptyOperator`` (#22974) - Deprecate ``DummyOperator`` in favor of ``EmptyOperator`` (#22832) - Remove unnecessary python 3.6 conditionals (#20549) - Bump ``moment`` from 2.29.1 to 2.29.2 in /airflow/www (#22873) - Bump ``prismjs`` from 1.26.0 to 1.27.0 in /airflow/www (#22823) - Bump ``nanoid`` from 3.1.23 to 3.3.2 in /airflow/www (#22803) - Bump ``minimist`` from 1.2.5 to 1.2.6 in /airflow/www (#22798) - Remove dag parsing from db init command (#22531) - Update our approach for executor-bound dependencies (#22573) - Use ``Airflow.Base.metadata`` in FAB models (#22353) - Limit docutils to make our documentation pretty again (#22420) - Add Python 3.10 support (#22050) - [FEATURE] add 1.22 1.23 K8S support (#21902) - Remove pandas upper limit now that SQLA is 1.4+ (#22162) - Patch ``sql_alchemy_conn`` if old postgres scheme used (#22333) - Protect against accidental misuse of XCom.get_value() (#22244) - Order filenames for migrations (#22168) - Don't try to auto generate migrations for Celery tables (#22120) - Require SQLAlchemy 1.4 (#22114) - bump sphinx-jinja (#22101) - Add compat shim for SQLAlchemy to avoid warnings (#21959) - Rename ``xcom.dagrun_id`` to ``xcom.dag_run_id`` (#21806) - Deprecate non-JSON ``conn.extra`` (#21816) - Bump upper bound version of ``jsonschema`` to 5.0 (#21712) - Deprecate helper utility ``days_ago`` (#21653) - Remove ```:type``` lines now ``sphinx-autoapi`` supports type hints (#20951) - Silence deprecation warning in tests (#20900) - Use ``DagRun.run_id`` instead of ``execution_date`` when updating state of TIs (UI & REST API) (#18724) - Add Context stub to Airflow packages (#20817) - Update Kubernetes library version (#18797) - Rename ``PodLauncher`` to ``PodManager`` (#20576) - Removes Python 3.6 support (#20467) - Add deprecation warning for non-json-serializable params (#20174) - Rename TaskMixin to DependencyMixin (#20297) - Deprecate passing execution_date to XCom methods (#19825) - Remove ``get_readable_dags`` and ``get_editable_dags``, and ``get_accessible_dags``. (#19961) - Remove postgres 9.6 support (#19987) - Removed hardcoded connection types. Check if hook is instance of DbApiHook. (#19639) - add kubernetes 1.21 support (#19557) - Add FAB base class and set import_name explicitly. (#19667) - Removes unused state transitions to handle auto-changing view permissions. (#19153) - Chore: Use enum for ``__var`` and ``__type`` members (#19303) - Use fab models (#19121) - Consolidate method names between Airflow Security Manager and FAB default (#18726) - Remove distutils usages for Python 3.10 (#19064) - Removing redundant ``max_tis_per_query`` initialisation on SchedulerJob (#19020) - Remove deprecated usage of ``init_role()`` from API (#18820) - Remove duplicate code on dbapi hook (#18821)