From 3fe6562c570001cbb15ab6b8fa3ed7ca4e7b5434 Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 24 Jul 2026 08:27:57 -0700 Subject: [PATCH] Fix: Handle a plain string as Celery sometimes provides for the traceback (#13267) --- src/documents/signals/handlers.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index f3ed824a2..fe1d1f94d 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -1264,7 +1264,17 @@ def task_failure_handler( "error_message": str(exception) if exception else "Unknown error", } if traceback: - tb_str = "".join(_tb.format_tb(traceback)) + # billiard/celery pass a pre-formatted string instead of a real + # traceback object when the worker process itself died (e.g. + # WorkerLostError from a SIGILL) since there's no live traceback + # to walk in that case. + tb_str = ( + traceback + if isinstance(traceback, str) + else "".join( + _tb.format_tb(traceback), + ) + ) result_data["traceback"] = tb_str[:5000] now = timezone.now()