Skip to content

[v3-3-test] Make deadline reads and serialization robust to dynamic/malformed intervals (#68919) - #70625

Draft
github-actions[bot] wants to merge 1 commit into
v3-3-testfrom
backport-f840a82-v3-3-test
Draft

[v3-3-test] Make deadline reads and serialization robust to dynamic/malformed intervals (#68919)#70625
github-actions[bot] wants to merge 1 commit into
v3-3-testfrom
backport-f840a82-v3-3-test

Conversation

@github-actions

Copy link
Copy Markdown
Contributor
  • Make deadline reads and serialization robust to dynamic/malformed intervals

Hardens the read and (de)serialization paths for deadline alerts so dynamic
(VariableInterval) and malformed stored data no longer break the UI/API.

  • UI deadline-alert response: DeadlineAlert.interval is a JSON column holding
    the Airflow-serialized interval, not a plain number. Coerce it to seconds for a
    fixed timedelta and to None for a dynamic VariableInterval (resolved
    later by the scheduler), instead of letting Pydantic 500 on the dict. The
    interval field becomes float | None.
  • Drop interval from the sortable columns of the deadline-alerts endpoint:
    ordering by a JSON column sorts by structure/text, not duration, so the result
    was arbitrary and misleading.
  • Deserialization: route by the encoder-stamped __class_path ahead of the
    reference_type name (a custom reference may share a class name with a
    builtin), and raise a clear error for a reference with no importable
    __class_path instead of an opaque KeyError.
  • Deadline.__repr__ / DeadlineAlert.__repr__ no longer raise: guard the
    dagrun relationship (the FK can be set while the relationship is None after a
    cascade delete) and handle the dict-shaped JSON interval. A __repr__ must
    never raise.
  • prune_deadlines explicitly excludes deadlines already marked missed so a
    missed deadline (whose callback is owned by the scheduler/triggerer) and its
    queued callback are never cascade-deleted.

Generated-by: Claude Code (Opus via Claude Code) on behalf of Sean Ghaeli

  • Remove redundant comments in deadline sort/deserialize

The sort-key comment restated a constraint already covered by
test_order_by_interval_is_rejected; the __class_path comment restated the
ValueError message right below it.

Generated-by: Claude Code (Opus)

  • Trim PR to the UI deadlineAlerts 500 fix only

Per review: keep only the interval coercion, order_by removal, and their
tests; move repr guards, decoder routing, and prune guard to a follow-up.


(cherry picked from commit f840a82)

Co-authored-by: Sean Ghaeli 58916776+seanghaeli@users.noreply.github.com
Co-authored-by: Sean Ghaeli ghaeli@amazon.com

…alformed intervals (#68919)

* Make deadline reads and serialization robust to dynamic/malformed intervals

Hardens the read and (de)serialization paths for deadline alerts so dynamic
(``VariableInterval``) and malformed stored data no longer break the UI/API.

- UI deadline-alert response: ``DeadlineAlert.interval`` is a JSON column holding
  the Airflow-serialized interval, not a plain number. Coerce it to seconds for a
  fixed ``timedelta`` and to ``None`` for a dynamic ``VariableInterval`` (resolved
  later by the scheduler), instead of letting Pydantic 500 on the dict. The
  ``interval`` field becomes ``float | None``.
- Drop ``interval`` from the sortable columns of the deadline-alerts endpoint:
  ordering by a JSON column sorts by structure/text, not duration, so the result
  was arbitrary and misleading.
- Deserialization: route by the encoder-stamped ``__class_path`` ahead of the
  ``reference_type`` name (a custom reference may share a class name with a
  builtin), and raise a clear error for a reference with no importable
  ``__class_path`` instead of an opaque ``KeyError``.
- ``Deadline.__repr__`` / ``DeadlineAlert.__repr__`` no longer raise: guard the
  ``dagrun`` relationship (the FK can be set while the relationship is None after a
  cascade delete) and handle the dict-shaped JSON interval. A ``__repr__`` must
  never raise.
- ``prune_deadlines`` explicitly excludes deadlines already marked ``missed`` so a
  missed deadline (whose callback is owned by the scheduler/triggerer) and its
  queued callback are never cascade-deleted.

Generated-by: Claude Code (Opus via Claude Code) on behalf of Sean Ghaeli

* Remove redundant comments in deadline sort/deserialize

The sort-key comment restated a constraint already covered by
test_order_by_interval_is_rejected; the __class_path comment restated the
ValueError message right below it.

Generated-by: Claude Code (Opus)

* Trim PR to the UI deadlineAlerts 500 fix only

Per review: keep only the interval coercion, order_by removal, and their
tests; move repr guards, decoder routing, and prune guard to a follow-up.

---------
(cherry picked from commit f840a82)

Co-authored-by: Sean Ghaeli <58916776+seanghaeli@users.noreply.github.com>
Co-authored-by: Sean Ghaeli <ghaeli@amazon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:API Airflow's REST/HTTP API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant