From 089c3f4af02b613e9a149f8b37e5638a4d273572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=9C=E9=A6=99=E9=A3=9E=E8=A1=8C=E7=9F=AE=E5=A0=87?= =?UTF-8?q?=E7=93=9C?= <91074632+p2003722@users.noreply.github.com> Date: Tue, 30 Jun 2026 22:40:37 +0800 Subject: [PATCH] fix(api): avoid infinite loop in _delete_records when batch deletion fails (#38118) Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- api/tasks/remove_app_and_related_data_task.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/api/tasks/remove_app_and_related_data_task.py b/api/tasks/remove_app_and_related_data_task.py index d0763a7a1ad..a4fb6d57207 100644 --- a/api/tasks/remove_app_and_related_data_task.py +++ b/api/tasks/remove_app_and_related_data_task.py @@ -701,16 +701,29 @@ def _delete_records(query_sql: str, params: dict[str, Any], delete_func: Callabl if not rows: break + success_count = 0 for i in rows: record_id = str(i.id) try: delete_func(session, record_id) logger.info(click.style(f"Deleted {name} {record_id}", fg="green")) + session.commit() + success_count += 1 except Exception: logger.exception("Error occurred while deleting %s %s", name, record_id) # continue with next record even if one deletion fails session.rollback() - break - session.commit() + continue rs.close() + + # If we couldn't delete ANY records in this batch, we must break out of the while loop + # to prevent an infinite loop where we keep fetching the same failing records. + if success_count == 0: + logger.warning( + click.style( + f"Failed to delete any {name} in the current batch. Stopping to prevent infinite loop.", + fg="yellow", + ) + ) + break