From 07af3734b57486bafbf1a97c75194428fd108a0b Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Tue, 26 Sep 2023 14:17:31 +0800 Subject: [PATCH] Use iterative loop to look for mapped parent This changes the logic in views to look for a parent mapped task group (so to decide whether a task group is mapped) from using a recursive function to an iterative loop. This should help prevent RecursionError when a DAG has deeply-nested task groups. I hope no-one really writes such a DAG in practice, but you never know. Also in cases both solutions work, the loop should generally be faster anyway due to how CPython is implemented. --- airflow/www/views.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/airflow/www/views.py b/airflow/www/views.py index ba6d4045c58d2..6fe8a32ea9dda 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -122,7 +122,7 @@ from airflow.utils.session import NEW_SESSION, create_session, provide_session from airflow.utils.state import DagRunState, State, TaskInstanceState from airflow.utils.strings import to_boolean -from airflow.utils.task_group import MappedTaskGroup, TaskGroup, task_group_to_dict +from airflow.utils.task_group import TaskGroup, task_group_to_dict from airflow.utils.timezone import td_format, utcnow from airflow.version import version from airflow.www import auth, utils as wwwutils @@ -426,14 +426,9 @@ def set_overall_state(record): **setup_teardown_type, } - def check_group_is_mapped(tg: TaskGroup | None) -> bool: - if tg is None: - return False - return isinstance(tg, MappedTaskGroup) or check_group_is_mapped(tg.parent_group) - # Task Group task_group = item - group_is_mapped = check_group_is_mapped(task_group) + group_is_mapped = next(task_group.iter_mapped_task_groups(), None) is not None children = [ task_group_to_grid(child, grouped_tis, is_parent_mapped=group_is_mapped)