Skip to content

Fix DAG processor treating non-.zip files as DAG bundles (#71125) - #71166

Closed
bujjibabukatta wants to merge 3 commits into
apache:mainfrom
bujjibabukatta:fix/#71125
Closed

bujjibabukatta wants to merge 3 commits into
apache:mainfrom
bujjibabukatta:fix/#71125

Conversation

@bujjibabukatta

@bujjibabukatta bujjibabukatta commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

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 attempt
DAG discovery on a file using zipfile.is_zipfile() alone — a content sniff for the PK zip
magic 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 .zip itself —
.jar, .pptx, .docx, .xlsx, .apk, .epub, .odt, .whl, etc. — any of these
dropped 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 shares
the 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 .pptx file, but that issue was closed as
invalid 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 content
sniff, so only files actually named .zip are treated as DAG zip bundles:

  • airflow-core/src/airflow/utils/file.py — find_dag_file_paths
  • airflow-core/src/airflow/dag_processing/importers/python_importer.py — PythonDagImporter.list_dag_files

I traced every other zipfile.is_zipfile() call site in the DAG processing code
(dag_processing/manager.py's _get_observed_filelocs, python_importer.py's import_file,
and utils/file.py's correct_maybe_zipped/open_maybe_zipped) and confirmed each is only
ever reached after this extension check upstream (or is already gated by a .zip-anchored
regex), 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 (via zipfile.ZipFile, so it genuinely sniffs as a zip) alongside a .py file and a
correctly-named .zip bundle, and asserting the .jar is excluded while the other two are
still discovered:

  • airflow-core/tests/unit/utils/test_file.py::TestListPyFilesPath::test_list_py_file_paths_ignores_non_zip_zip_format_files
  • airflow-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?
  • Yes

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 UTC

Helpful heads-up from the maintainers — please address before this PR can be reviewed:

  • ❌ Other failing CI checks. See docs.
  • ❌ Pre-commit / static checks. See docs.
  • ❌ Provider tests. See docs.

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.

@potiuk

potiuk commented Sep 25, 2026

Copy link
Copy Markdown
Member

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 gh pr reopen <PR_NUMBER> --repo apache/airflow. Reopen the ones you are ready to follow through - keep them rebased, respond to review comments and fix failing checks.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:dag-processor closed because of open PR limit Closed as a one-time step of introducing the open pull request limit

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DAG processor treats any zip-format file (.jar, .pptx, .docx, .xlsx, etc.) as a potential DAG bundle, not just .zip

2 participants