diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index a8a8fa05e..02696579d 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -5,7 +5,6 @@ import shutil import httpx from celery import shared_task from celery import states -from celery.exceptions import MaxRetriesExceededError from celery.signals import before_task_publish from celery.signals import task_failure from celery.signals import task_postrun @@ -576,6 +575,8 @@ def run_workflows_updated(sender, document: Document, logging_group=None, **kwar @shared_task( retry_backoff=True, + autoretry_for=(httpx.HTTPStatusError,), + retry_kwargs={"max_retries": 3}, ) def send_webhook(url, data, headers, files): try: @@ -588,16 +589,11 @@ def send_webhook(url, data, headers, files): logger.info( f"Webhook sent to {url}", ) - except httpx.HTTPStatusError as e: + except Exception as e: logger.error( - f"Failed sending webhook to {url}: {e}", + f"Failed attempt sending webhook to {url}: {e}", ) - try: - send_webhook.retry(exc=e, max_retries=3) - except MaxRetriesExceededError: - logger.error( - f"Max retries exceeded for webhook to {url}", - ) + raise e def run_workflows( diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index b861672b5..972485d34 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -19,7 +19,6 @@ from documents.signals.handlers import send_webhook if TYPE_CHECKING: from django.db.models import QuerySet -from celery.exceptions import MaxRetriesExceededError from documents import tasks from documents.data_models import ConsumableDocument @@ -2539,8 +2538,7 @@ class TestWorkflows( self.assertIn(expected_str, cm.output[0]) @mock.patch("httpx.post") - @mock.patch("documents.signals.handlers.send_webhook.retry") - def test_workflow_webhook_send_webhook_retry(self, mock_retry, mock_http): + def test_workflow_webhook_send_webhook_retry(self, mock_http): mock_http.return_value.raise_for_status = mock.Mock( side_effect=HTTPStatusError( "Error", @@ -2548,19 +2546,19 @@ class TestWorkflows( response=mock.Mock(), ), ) - mock_retry.side_effect = MaxRetriesExceededError("Max retries exceeded") with self.assertLogs("paperless.handlers") as cm: - send_webhook( - url="http://paperless-ngx.com", - data="Test message", - headers={}, - files=None, - ) + with self.assertRaises(HTTPStatusError): + send_webhook( + url="http://paperless-ngx.com", + data="Test message", + headers={}, + files=None, + ) - self.assertEqual(mock_retry.call_count, 1) + self.assertEqual(mock_http.call_count, 1) - expected_str = "Failed sending webhook to http://paperless-ngx.com" - expected_str2 = "Max retries exceeded" - self.assertIn(expected_str, cm.output[0]) - self.assertIn(expected_str2, cm.output[1]) + expected_str = ( + "Failed attempt sending webhook to http://paperless-ngx.com" + ) + self.assertIn(expected_str, cm.output[0])