Fix DAG processor treating non-.zip files as DAG bundles (#71125) - #71166
bujjibabukatta wants to merge 3 commits into
Conversation
3200faa to
470ce9a
Compare
|
Hello @bujjibabukatta - thank you for your contributions to Apache Airflow! The Airflow community has introduced a limit of 5 open pull requests at a time for contributors without write access to the repository. You currently have 16 open pull requests, so - as a one-time step of introducing the limit - we closed the ones where maintainers have not engaged yet:
These pull requests stay open because maintainers are already engaged in them - they count towards your limit:
This is not a judgement of you or of your changes. We never told contributors before that opening many pull requests at once was a problem, so there is nothing to feel bad about - and nothing is lost: your branches, commits and the review history stay where they are. What we ask you to do is to make your first prioritization decision: choose which of the pull requests above matter most to you, and reopen them (up to 5 open at a time, including the ones still open) with the "Reopen pull request" button or While your pull requests are waiting for review, the most valuable thing you can do is help in other ways - reviewing other contributors' pull requests, helping with issues, and taking part in the discussions on the devlist and Slack. Why we introduced the limit, what it means for you and how to reopen or restore a pull request is explained in https://github.com/apache/airflow/blob/main/contributing-docs/32_open_pull_request_limit.rst. Drafted-by: Claude Code (Opus 5); reviewed by @potiuk before posting |
DAG processor treats any zip-format file (.jar, .pptx, .docx, .xlsx, etc.) as a potential DAG bundle, not just .zip
Problem
find_dag_file_paths(airflow-core/src/airflow/utils/file.py) decided whether to attemptDAG discovery on a file using
zipfile.is_zipfile()alone — a content sniff for the PK zipmagic bytes, not an extension check. The same unguarded pattern existed in
PythonDagImporter.list_dag_files(airflow-core/src/airflow/dag_processing/importers/python_importer.py),the newer importer-based discovery path used by
DagBag.Since the zip container format underlies many common file types beyond
.zipitself —.jar,.pptx,.docx,.xlsx,.apk,.epub,.odt,.whl, etc. — any of thesedropped into a DAGs folder (a build artifact, a supporting doc, a packaged dependency) would
pass this check and get opened and scanned via
might_contain_dag, purely because it sharesthe underlying container format with Airflow's own zipped-DAG-bundle feature. At minimum this
is wasted work on every DAG processor cycle; depending on the archive's contents it can also
produce confusing log noise.
This was reported previously in #45718 with a
.pptxfile, but that issue was closed asinvalid because the specific symptom reported there turned out to be an unrelated bug. The
underlying zip-detection design issue itself was never fixed.
Fix
Gate both zip-bundle branches on
path.suffix == ".zip"in addition to the existing contentsniff, so only files actually named
.zipare treated as DAG zip bundles:airflow-core/src/airflow/utils/file.py—find_dag_file_pathsairflow-core/src/airflow/dag_processing/importers/python_importer.py—PythonDagImporter.list_dag_filesI traced every other
zipfile.is_zipfile()call site in the DAG processing code(
dag_processing/manager.py's_get_observed_filelocs,python_importer.py'simport_file,and
utils/file.py'scorrect_maybe_zipped/open_maybe_zipped) and confirmed each is onlyever reached after this extension check upstream (or is already gated by a
.zip-anchoredregex), so no other locations required changes.
Tests
Added a regression test for each fixed code path, each building a real zip-format file named
.jar(viazipfile.ZipFile, so it genuinely sniffs as a zip) alongside a.pyfile and acorrectly-named
.zipbundle, and asserting the.jaris excluded while the other two arestill discovered:
airflow-core/tests/unit/utils/test_file.py::TestListPyFilesPath::test_list_py_file_paths_ignores_non_zip_zip_format_filesairflow-core/tests/unit/dag_processing/importers/test_python_importer.py::TestPythonDagImporterListDagFiles::test_list_dag_files_ignores_non_zip_zip_format_files(new file)Also added
airflow-core/newsfragments/71125.bugfix.rst.closes: #71125
Was generative AI tooling used to co-author this PR?
Generated-by: Claude (Anthropic), used to draft the code fix, the two regression test cases,
this PR description, and the newsfragment, following the guidelines.
All generated code and tests were reviewed and verified by me before submission.
Important
🛠️ Maintainer triage note for @bujjibabukatta · by
@potiuk· 2026-08-13 12:55 UTCHelpful heads-up from the maintainers — please address before this PR can be reviewed:
Full list of what we check: Pull Request quality criteria.
The ball is in your court — you've been assigned to this PR. Fix the above, then mark it Ready for review.
Automated triage — may be imperfect; a maintainer takes the next look.