Skip to content

Unable to use XComObjectStorageBackend with apache-airflow-providers-common-io==1.6.2 #55803

@wolfier

Description

@wolfier

Apache Airflow Provider(s)

common-io

Versions of Apache Airflow Providers

apache-airflow-providers-common-io==1.6.2

Apache Airflow version

2.11.0

Operating System

debian

Deployment

Astronomer

Deployment details

Fresh deployment running Runtime 13.2.0. This version uses Airflow 2.11.0 with apache-airflow-providers-common-io==1.6.2.

What happened

Configured a custom XCom backend.

AIRFLOW__CORE__XCOM_BACKEND=airflow.providers.common.io.xcom.backend.XComObjectStorageBackend

The scheduler and triggerer are failing to star. The errors seem to be originating from importing BaseOperator that is triggered by a custom plugin. This happens to other plugins too.

[2025-09-17T18:32:13.715+0000] {plugins_manager.py:267} ERROR - Failed to import plugin openlineage
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/airflow/configuration.py", line 1346, in getimport
    return import_string(full_qualified_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/utils/module_loading.py", line 39, in import_string
    module = import_module(module_path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 999, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/local/lib/python3.12/site-packages/airflow/providers/common/io/xcom/backend.py", line 30, in <module>
    from airflow.providers.common.io.version_compat import AIRFLOW_V_3_0_PLUS
  File "/usr/local/lib/python3.12/site-packages/airflow/providers/common/io/version_compat.py", line 40, in <module>
    from airflow.models import BaseOperator
  File "/usr/local/lib/python3.12/site-packages/airflow/models/__init__.py", line 79, in __getattr__
    val = import_string(f"{path}.{name}")
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/utils/module_loading.py", line 39, in import_string
    module = import_module(module_path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/models/baseoperator.py", line 83, in <module>
    from airflow.models.mappedoperator import OperatorPartial, validate_mapping_kwargs
  File "/usr/local/lib/python3.12/site-packages/airflow/models/mappedoperator.py", line 54, in <module>
    from airflow.triggers.base import StartTriggerArgs
  File "/usr/local/lib/python3.12/site-packages/airflow/triggers/base.py", line 27, in <module>
    from airflow.models.taskinstance import SimpleTaskInstance
ImportError: cannot import name 'SimpleTaskInstance' from partially initialized module 'airflow.models.taskinstance' (most likely due to a circular import) (/usr/local/lib/python3.12/site-packages/airflow/models/taskinstance.py)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/airflow/plugins_manager.py", line 259, in load_entrypoint_plugins
    plugin_class = entry_point.load()
                   ^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/importlib/metadata/__init__.py", line 205, in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 999, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/usr/local/lib/python3.12/site-packages/airflow/providers/openlineage/plugins/openlineage.py", line 21, in <module>
    from airflow.providers.openlineage.plugins.listener import get_openlineage_listener
  File "/usr/local/lib/python3.12/site-packages/airflow/providers/openlineage/plugins/listener.py", line 31, in <module>
    from airflow.models import DagRun, TaskInstance
  File "<frozen importlib._bootstrap>", line 1412, in _handle_fromlist
  File "/usr/local/lib/python3.12/site-packages/airflow/models/__init__.py", line 79, in __getattr__
    val = import_string(f"{path}.{name}")
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/utils/module_loading.py", line 39, in import_string
    module = import_module(module_path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/models/dagrun.py", line 60, in <module>
    from airflow.models.taskinstance import TaskInstance as TI
  File "/usr/local/lib/python3.12/site-packages/airflow/models/taskinstance.py", line 104, in <module>
    from airflow.models.xcom import LazyXComSelectSequence, XCom
  File "/usr/local/lib/python3.12/site-packages/airflow/models/xcom.py", line 815, in <module>
    XCom = resolve_xcom_backend()
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/models/xcom.py", line 798, in resolve_xcom_backend
    clazz = conf.getimport("core", "xcom_backend", fallback=f"airflow.models.xcom.{BaseXCom.__name__}")
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/airflow/configuration.py", line 1349, in getimport
    raise AirflowConfigException(
airflow.exceptions.AirflowConfigException: The object could not be loaded. Please check "xcom_backend" key in "core" section. Current value: "airflow.providers.common.io.xcom.backend.XComObjectStorageBackend".

What you think should happen instead

The scheduler and triggerer should start up without issue with a custom XCom backend.

How to reproduce

  1. Start a deployment with Runtime 13.2.0 (Airflow 2.11.0)
  2. Configure the custom XCom backend to airflow.providers.common.io.xcom.backend.XComObjectStorageBackend.
  3. Start the deployment.
FROM quay.io/astronomer/astro-runtime:13.2.0
ENV AIRFLOW__CORE__XCOM_BACKEND=airflow.providers.common.io.xcom.backend.XComObjectStorageBackend

Anything else

This behaviour can be mitigated when apache-airflow-providers-common-io version is pinned to 1.6.0.

I suspect the issue is because of #52443 as that is where BaseOperator was replaced in the common provider. The change was introduced in 1.6.1
.

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