You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "kaxil (via GitHub)" <gi...@apache.org> on 2026/06/19 00:31:04 UTC

[PR] Fix `RecursionError` in `common.compat` hook lineage `add_extra` polyfill [airflow]

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

   On Airflow < 3.2, `common.compat`'s `get_hook_lineage_collector()` polyfills `add_extra` by
   monkeypatching the `collected_assets` and `has_collected` **class** properties of the lineage
   collector. `_add_extra_polyfill` was not idempotent: the trigger gate (`_lacks_add_extra_method`)
   checks **instance-level** `_extra`, so a fresh collector instance of an already-patched class
   re-enters the polyfill and re-wraps the class property, capturing the previously installed wrapper
   as the "original". Each call stacks another layer onto the getter chain, so once enough collectors
   are created the next `collected_assets` / `has_collected` access exceeds the recursion limit and
   raises `RecursionError`.
   
   ## Where it shows up
   
   In production the global collector is a process singleton (the accessor is `@cache`-decorated) and
   the polyfill only runs on Airflow < 3.2, so it is applied exactly once -- no impact. The failure
   surfaces on the **Compat 3.1.x provider test matrix**, where a fresh `HookLineageCollector` is built
   per test: the class accumulates one wrapper per test until the lineage edge-case tests blow the
   recursion limit. This is a test-suite/robustness fix, not a production incident.
   
   ## Fix
   
   Make `_add_extra_polyfill` idempotent -- patch each collector class exactly once:
   
   - Skip re-patching when the class's own `__dict__` already carries a `_compat_extra_polyfilled`
     marker (checked on the exact class, not via inheritance, so a subclass that overrides these
     properties is still patched in its own right).
   - Set the marker only after all three patches (`collected_assets`, `has_collected`, `add_extra`)
     are installed, so a failure mid-patch leaves the class unmarked and retryable rather than
     half-patched.
   - Initialize the instance `_extra` / `_extra_counts` only when missing, so re-applying never clears
     a collector that already accumulated extras.
   
   Behavior is otherwise unchanged: every collector still gets `add_extra` and the extended
   `collected_assets` / `has_collected`.
   


-- 
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: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix `RecursionError` in `common.compat` hook lineage `add_extra` polyfill [airflow]

Posted by "kacpermuda (via GitHub)" <gi...@apache.org>.
kacpermuda commented on PR #68735:
URL: https://github.com/apache/airflow/pull/68735#issuecomment-4750322278

   Thanks Kaxil for fixing this, missed that for sure when writing tests


-- 
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: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Fix `RecursionError` in `common.compat` hook lineage `add_extra` polyfill [airflow]

Posted by "kaxil (via GitHub)" <gi...@apache.org>.
kaxil merged PR #68735:
URL: https://github.com/apache/airflow/pull/68735


-- 
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: commits-unsubscribe@airflow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org