Description
Add a deployment-wide global pause toggle (UI, REST API, and CLI) that makes the scheduler treat every DAG as paused without changing any DAG's stored is_paused value.
While global pause is enabled:
- The scheduler schedules no new DAG runs.
- The scheduler schedules no new tasks.
- Per-DAG
is_paused in the metadata DB stays untouched.
When global pause is disabled:
- Each DAG immediately returns to its previous behavior based on its own
is_paused state.
- No restore step and no tracking of which DAGs were paused before.
This is a scheduler-level override, not bulk pause/unpause of individual DAGs.
The UI should show when global pause is active. Per-DAG pause toggles should still reflect each DAG's real is_paused value (not the effective scheduling state), so operators can see which DAGs were already paused before the freeze.
Use case/motivation
We need a way to freeze an entire Airflow deployment for operational work (upgrades, migrations, incident response) without losing per-DAG pause state.
Pausing every DAG individually overwrites is_paused and makes it hard to restore the previous mix of paused and active DAGs on large deployments. Suspend/resume style approaches that mutate is_paused and restore later have the same problem.
Typical scenario: a deployment with many DAGs, some intentionally paused and some active. An admin needs to stop all scheduling quickly, do maintenance, then release the freeze and have every DAG behave exactly as it did before. No custom restore script, no risk of unpausing DAGs that were paused on purpose.
Related issues
Are you willing to submit a PR?
Code of Conduct
Description
Add a deployment-wide global pause toggle (UI, REST API, and CLI) that makes the scheduler treat every DAG as paused without changing any DAG's stored
is_pausedvalue.While global pause is enabled:
is_pausedin the metadata DB stays untouched.When global pause is disabled:
is_pausedstate.This is a scheduler-level override, not bulk pause/unpause of individual DAGs.
The UI should show when global pause is active. Per-DAG pause toggles should still reflect each DAG's real
is_pausedvalue (not the effective scheduling state), so operators can see which DAGs were already paused before the freeze.Use case/motivation
We need a way to freeze an entire Airflow deployment for operational work (upgrades, migrations, incident response) without losing per-DAG pause state.
Pausing every DAG individually overwrites
is_pausedand makes it hard to restore the previous mix of paused and active DAGs on large deployments. Suspend/resume style approaches that mutateis_pausedand restore later have the same problem.Typical scenario: a deployment with many DAGs, some intentionally paused and some active. An admin needs to stop all scheduling quickly, do maintenance, then release the freeze and have every DAG behave exactly as it did before. No custom restore script, no risk of unpausing DAGs that were paused on purpose.
Related issues
Are you willing to submit a PR?
Code of Conduct