From 518e3e43c5a879593eb5f6d4999056e058d8de66 Mon Sep 17 00:00:00 2001 From: Kyle Consalus Date: Fri, 27 Jun 2025 15:00:41 -0700 Subject: [PATCH 1/3] fix(tasks): Make the retry decorator play nicer with retry_task --- src/sentry/tasks/base.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sentry/tasks/base.py b/src/sentry/tasks/base.py index c42efe36037571..df24f2e2524708 100644 --- a/src/sentry/tasks/base.py +++ b/src/sentry/tasks/base.py @@ -9,6 +9,7 @@ import sentry_sdk from celery import Task +from celery.exceptions import MaxRetriesExceededError, Retry from django.conf import settings from django.db.models import Model @@ -16,7 +17,7 @@ from sentry.celery import app from sentry.silo.base import SiloLimit, SiloMode from sentry.taskworker.config import TaskworkerConfig -from sentry.taskworker.retry import retry_task +from sentry.taskworker.retry import RetryError, retry_task from sentry.taskworker.task import Task as TaskworkerTask from sentry.utils import metrics from sentry.utils.memory import track_memory_usage @@ -244,6 +245,10 @@ def inner(func): def wrapped(*args, **kwargs): try: return func(*args, **kwargs) + except (MaxRetriesExceededError, Retry, RetryError): + # We shouldn't interfere with exceptions that exist to communicate + # retry state. + raise except ignore: return except ignore_and_capture: From dafd09cc58e171956b3cc9778a479b53eb4e374e Mon Sep 17 00:00:00 2001 From: Kyle Consalus Date: Fri, 27 Jun 2025 15:20:47 -0700 Subject: [PATCH 2/3] Better coverage --- src/sentry/tasks/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/tasks/base.py b/src/sentry/tasks/base.py index df24f2e2524708..e2efc39c1e195e 100644 --- a/src/sentry/tasks/base.py +++ b/src/sentry/tasks/base.py @@ -9,7 +9,7 @@ import sentry_sdk from celery import Task -from celery.exceptions import MaxRetriesExceededError, Retry +from celery.exceptions import Ignore, Reject, Retry from django.conf import settings from django.db.models import Model @@ -245,7 +245,7 @@ def inner(func): def wrapped(*args, **kwargs): try: return func(*args, **kwargs) - except (MaxRetriesExceededError, Retry, RetryError): + except (RetryError, Retry, Ignore, Reject): # We shouldn't interfere with exceptions that exist to communicate # retry state. raise From c0540092f0226bef3182fc580f4ebfe24d9fb8f9 Mon Sep 17 00:00:00 2001 From: Kyle Consalus Date: Fri, 27 Jun 2025 15:52:46 -0700 Subject: [PATCH 3/3] Include max exceeded from Celery --- src/sentry/tasks/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/tasks/base.py b/src/sentry/tasks/base.py index e2efc39c1e195e..5ed5fa675fd20f 100644 --- a/src/sentry/tasks/base.py +++ b/src/sentry/tasks/base.py @@ -9,7 +9,7 @@ import sentry_sdk from celery import Task -from celery.exceptions import Ignore, Reject, Retry +from celery.exceptions import Ignore, MaxRetriesExceededError, Reject, Retry from django.conf import settings from django.db.models import Model @@ -245,7 +245,7 @@ def inner(func): def wrapped(*args, **kwargs): try: return func(*args, **kwargs) - except (RetryError, Retry, Ignore, Reject): + except (RetryError, Retry, Ignore, Reject, MaxRetriesExceededError): # We shouldn't interfere with exceptions that exist to communicate # retry state. raise