refactor retry

This commit is contained in:
shamoon 2024-12-02 08:00:51 -08:00
parent efb10d38a2
commit e657330ac1
2 changed files with 18 additions and 24 deletions

View File

@ -5,7 +5,6 @@ import shutil
import httpx import httpx
from celery import shared_task from celery import shared_task
from celery import states from celery import states
from celery.exceptions import MaxRetriesExceededError
from celery.signals import before_task_publish from celery.signals import before_task_publish
from celery.signals import task_failure from celery.signals import task_failure
from celery.signals import task_postrun from celery.signals import task_postrun
@ -576,6 +575,8 @@ def run_workflows_updated(sender, document: Document, logging_group=None, **kwar
@shared_task( @shared_task(
retry_backoff=True, retry_backoff=True,
autoretry_for=(httpx.HTTPStatusError,),
retry_kwargs={"max_retries": 3},
) )
def send_webhook(url, data, headers, files): def send_webhook(url, data, headers, files):
try: try:
@ -588,16 +589,11 @@ def send_webhook(url, data, headers, files):
logger.info( logger.info(
f"Webhook sent to {url}", f"Webhook sent to {url}",
) )
except httpx.HTTPStatusError as e: except Exception as e:
logger.error( 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( def run_workflows(

View File

@ -19,7 +19,6 @@ from documents.signals.handlers import send_webhook
if TYPE_CHECKING: if TYPE_CHECKING:
from django.db.models import QuerySet from django.db.models import QuerySet
from celery.exceptions import MaxRetriesExceededError
from documents import tasks from documents import tasks
from documents.data_models import ConsumableDocument from documents.data_models import ConsumableDocument
@ -2539,8 +2538,7 @@ class TestWorkflows(
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
@mock.patch("httpx.post") @mock.patch("httpx.post")
@mock.patch("documents.signals.handlers.send_webhook.retry") def test_workflow_webhook_send_webhook_retry(self, mock_http):
def test_workflow_webhook_send_webhook_retry(self, mock_retry, mock_http):
mock_http.return_value.raise_for_status = mock.Mock( mock_http.return_value.raise_for_status = mock.Mock(
side_effect=HTTPStatusError( side_effect=HTTPStatusError(
"Error", "Error",
@ -2548,9 +2546,9 @@ class TestWorkflows(
response=mock.Mock(), response=mock.Mock(),
), ),
) )
mock_retry.side_effect = MaxRetriesExceededError("Max retries exceeded")
with self.assertLogs("paperless.handlers") as cm: with self.assertLogs("paperless.handlers") as cm:
with self.assertRaises(HTTPStatusError):
send_webhook( send_webhook(
url="http://paperless-ngx.com", url="http://paperless-ngx.com",
data="Test message", data="Test message",
@ -2558,9 +2556,9 @@ class TestWorkflows(
files=None, 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_str = (
expected_str2 = "Max retries exceeded" "Failed attempt sending webhook to http://paperless-ngx.com"
)
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
self.assertIn(expected_str2, cm.output[1])