Eason09053360 opened a new pull request, #73141:
URL: https://github.com/apache/airflow/pull/73141

   ## Why
   
   Enabling the documented `[scheduler] only_idle` option leaves the deployment 
without a scheduler. `ARG_ONLY_IDLE` resolved its default from config at import 
time, so the guard in `scheduler_command.scheduler()` could not tell an 
explicitly typed `--only-idle` from a config-supplied default. Since 
`[scheduler] num_runs` defaults to `-1`, the guard tripped on every invocation:
   
   ```console
   $ AIRFLOW__SCHEDULER__ONLY_IDLE=True airflow scheduler
   The --only-idle flag requires --num-runs to be set to a positive number.   # 
exit 1
   ```
   
   The same import-time default made the option impossible to switch off: 
`action="store_true"` only pushes towards `True`, so once config enabled it, no 
command line could get back to `False` — the opposite of the usual 
command-line-beats-config precedence.
   
   The guard itself is only about usability. `SchedulerJobRunner` already 
ignores `only_idle` when the run limit is not positive (`run_count >= 
self.num_runs > 0`), so a non-positive `num_runs` is inert rather than 
dangerous.
   
   ## What
   
   `airflow-core/src/airflow/cli/cli_config.py` — `ARG_ONLY_IDLE` becomes 
tri-state: `default=None` with `argparse.BooleanOptionalAction`, so `None` 
means "user said nothing", and `--no-only-idle` can override a config-enabled 
default.
   
   `airflow-core/src/airflow/cli/commands/scheduler_command.py` — 
`_resolve_only_idle()` reads `[scheduler] only_idle` when the command runs 
instead of when the parser is built. An explicit `--only-idle` without a 
positive `--num-runs` still raises `SystemExit` with the same message; the 
config-supplied case now logs a warning and starts. The warning names both 
`--num-runs` and `[scheduler] num_runs`, since the non-positive limit can come 
from either.
   
   `airflow-core/src/airflow/config_templates/config.yml` — record that 
`only_idle` has no effect unless `num_runs` is positive.
   
   Tests cover the three-way flag, that a config-enabled `only_idle` starts the 
scheduler and reaches `SchedulerJobRunner`, and that `--no-only-idle` wins over 
config. `test_only_idle_help_survives_rich_markup_rendering` asserts against 
rendered `--help` output rather than the raw `help=` kwarg, because the 
Rich-based help formatter silently swallows `[section]` text — the reason the 
help string spells the option `scheduler.only_idle`.
   
   ---
   
   ##### Was generative AI tooling used to co-author this PR?
   
   - [X] Yes — Claude Code (Opus 5)
   
   Generated-by: Claude Code (Opus 5) following [the 
guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#gen-ai-assisted-contributions)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to