Hi all,
Following up on the proposal from April, the changes are now open as PRs: 1. https://github.com/apache/airflow/pull/69260 (derive the async database URI for cockroachdb connection strings) 2. https://github.com/apache/airflow/pull/69555 (make the task_instance UUID migration work without pgcrypto) 3. https://github.com/apache/airflow/pull/69556 (survive serialization conflicts in the scheduler critical section; this is the substantive one and includes a behavior improvement for PostgreSQL under SERIALIZABLE) 4. https://github.com/apache/airflow/pull/69557 (extend the scheduler's HA advisory lock coordination to the cockroachdb dialect, which implements the same transaction-level advisory locks as of CockroachDB 26.3) Each is independent and intentionally small. Happy to adjust scope or framing based on any comments here or on the PRs. Thanks & regards, Virag On Tue, May 19, 2026 at 8:55 PM Virag Tripathi < [email protected]> wrote: > Hi all, > > Friendly bump on this thread. It's been about a month since I posted the > original proposal and I haven't seen any replies, so I wanted to check if > the framing landed okay or if there are concerns I should address > differently. > > Quick update since the original post: > > - The sqlalchemy-cockroachdb 2.0.4 release shipped with the > @compiles(timestampdiff, "cockroachdb") fix (PR #301), so the timestampdiff > issue no longer requires any change in Airflow itself. That's one fewer > thing to worry about. > > - The POC repo (https://github.com/viragtripathi/cockroachdb-airflow-poc) > is public and running end-to-end on Airflow 3.2.1 + CockroachDB v25.4 LTS. > 68 tables migrated, DAG parsing, scheduling, task execution all working. > Anyone is welcome to spin it up and poke at it. > > To recap, the three proposals are: > > 1. Generic 40001 serialization-failure retry in the scheduler (fix > retry_db_transaction to roll back on any DBAPIError, not just > OperationalError). This one benefits PostgreSQL users under high > concurrency too. > > 2. Add "cockroachdb": "asyncpg" to the async-driver mapping in > settings.py. One-line change. > > 3. Dialect-aware UUID generation in migration 0042 so non-postgres > PG-compatible dialects can supply their own UUID generator. Migration runs > once, no impact on existing PG installs. > > Jarek, since you originally suggested bringing this to the devlist in > discussion #65453, I'd especially value your take on whether these are > scoped right. Happy to adjust the framing or break anything down further. > > I'm ready to draft the PRs as soon as there's maintainer signal that the > direction is acceptable. Even a "these look fine, go ahead" or "change X > before you PR" would be really helpful. > > Thanks for your time. > > Virag Tripathi > > > [1] https://github.com/apache/airflow/discussions/65453 > [2] https://github.com/viragtripathi/cockroachdb-airflow-poc > [3] https://github.com/cockroachdb/sqlalchemy-cockroachdb/pull/301 > > On Sat, Apr 18, 2026 at 10:59 AM Virag Tripathi < > [email protected]> wrote: > >> Hi all, >> >> >> Per Jarek's suggestion in GitHub discussion #65453 [1], I'm bringing this >> proposal to the devlist before opening PRs. The full long-form post is on >> the discussion; this is a tighter summary for devlist review. >> >> >> I'm working on improving Airflow 3.x's behavior on PostgreSQL-compatible >> databases (currently focused on CockroachDB, which is wire-protocol >> compatible with PG). Three small, generically-justifiable improvements have >> come out of that work. I want maintainer signal on the proposal before >> drafting PRs. >> >> >> == Background (skip if uninterested) == >> >> - Integration POC validates Airflow 3.2.0 against CockroachDB v25.4: >> airflow db migrate succeeds, DAG parsing/scheduling/task execution all >> work, example DAGs run end-to-end. 111 Alembic migrations audited, 12 >> findings, all handled. >> - A patch for sqlalchemy-cockroachdb [3] registers >> @compiles(timestampdiff, "cockroachdb") so MySQL-style >> func.timestampdiff(unit, start, end) (the fallback used in >> airflow-core/src/airflow/models/taskinstance.py and dagrun.py for >> non-PG/non-SQLite dialects) compiles to a PostgreSQL-style EXTRACT(EPOCH >> FROM ...) expression. This means Airflow itself needs no change for the >> timestampdiff issue once the dialect ships 2.0.4+. >> >> So the items below are the only ones that genuinely require small >> upstream changes. >> >> >> *== Proposed change 1 — Generic 40001 serialization-failure retry in the >> scheduler ==* >> >> Files: airflow-core/src/airflow/utils/retries.py and >> airflow-core/src/airflow/jobs/scheduler_job_runner.py >> >> Why this is generic, not CRDB-specific: PostgreSQL also raises >> SerializationFailure (SQLSTATE 40001) under high concurrency on >> SELECT ... FOR NO KEY UPDATE ... SKIP LOCKED. Today Airflow's scheduler >> does not retry these reliably. Issue #40882 [4] (closed) noted that >> retry_db_transaction only issues session.rollback() for >> OperationalError, not all DBAPIError subclasses, leaving subsequent retries >> to fail with InFailedSqlTransaction. >> >> Proposal: >> >> 1. Fix retry_db_transaction to roll back on any DBAPIError, not just >> OperationalError. >> 2. Apply it (or an equivalent retry loop) to >> _critical_section_enqueue_task_instances. >> 3. Use exponential backoff and bound the number of retries. >> >> Risk: Medium — touches the scheduler hot path. Should be guarded by tests >> that fault-inject 40001 and assert progress. Benefit: Improves PG >> resilience under concurrent scheduler workloads. Side benefit: makes the >> scheduler usable on any PG-compatible DB whose isolation model surfaces >> 40001. >> >> This is the largest of the three changes and the one I most want a steer >> on. >> >> >> *== Proposed change 2 — Add cockroachdb to the async-driver mapping ==* >> >> File: airflow-core/src/airflow/settings.py:240 >> >> def _get_async_conn_uri_from_sync(sync_uri): AIO_LIBS_MAPPING = {"sqlite": >> "aiosqlite", "postgresql": "asyncpg", "mysql": "aiomysql"} ... >> >> Proposal: Add "cockroachdb": "asyncpg" to the mapping. >> >> Why standalone-justifiable: This function exists to derive an async URI >> when one isn't explicitly configured. Today, anyone using a >> cockroachdb:// SQLAlchemy URL (the canonical scheme registered by >> sqlalchemy-cockroachdb since 2017) hits "The asyncio extension requires an >> async driver. The loaded 'psycopg2' is not async." The workaround is >> setting AIRFLOW__DATABASE__SQL_ALCHEMY_CONN_ASYNC explicitly. One-line >> fix; no behavior change for postgres/mysql/sqlite users. >> >> Risk: Trivial. Touches one dict literal. >> >> >> *== Proposed change 3 — Dialect-aware UUID generation in migration >> 0042 ==* >> >> >> File: >> airflow-core/src/airflow/migrations/versions/0042_3_0_0_add_uuid_primary_key_to_task_instance_.py >> >> The migration creates a custom uuid_generate_v7() SQL function via CREATE >> EXTENSION pgcrypto. CockroachDB doesn't expose pgcrypto extensions but >> offers native gen_random_uuid(). >> >> Proposal: Add a dialect-name check at the top of the upgrade so >> non-postgres PG-compatible dialects can supply their own UUID >> generator (defaulting to gen_random_uuid() for cockroachdb). PG users see >> no change. The fallback uses v4 UUIDs (not v7) on the alternate >> dialect, which is documented as a tradeoff. >> >> Risk: Low. Migration runs once, dialect-name-guarded, no impact on >> existing PG installs. >> >> >> == What I'm asking == >> >> 1. Are these acceptable as standalone PRs against main? >> 2. Any framing or scoping changes you'd like before I draft them? >> 3. For change 1 specifically: any preference on where the retry logic >> lives (decorator vs. explicit loop in the scheduler call site)? >> >> == Disclosure == >> >> I work at Cockroach Labs. The integration POC and >> sqlalchemy-cockroachdb#301 are linked below for full transparency. Happy to >> share any additional context. >> >> >> Thanks for reading. >> >> Virag Tripathi >> >> >> [1] https://github.com/apache/airflow/discussions/65453 >> >> [2] https://github.com/apache/airflow/issues/46175 >> >> [3] https://github.com/cockroachdb/sqlalchemy-cockroachdb/pull/301 >> >> [4] https://github.com/apache/airflow/issues/40882 >> >
