diff --git a/src/pretix/plugins/banktransfer/tasks.py b/src/pretix/plugins/banktransfer/tasks.py index 62bf1e9d18..3b8739e6d6 100644 --- a/src/pretix/plugins/banktransfer/tasks.py +++ b/src/pretix/plugins/banktransfer/tasks.py @@ -3,6 +3,7 @@ import logging import re from decimal import Decimal +from celery.exceptions import MaxRetriesExceededError from django.conf import settings from django.db import transaction from django.utils.translation import ugettext_noop @@ -10,6 +11,7 @@ from django.utils.translation import ugettext_noop from pretix.base.i18n import language from pretix.base.models import Event, Order, Quota from pretix.base.services.async import TransactionAwareTask +from pretix.base.services.locking import LockTimeoutException from pretix.base.services.mail import SendMailException from pretix.base.services.orders import mark_order_paid from pretix.celery import app @@ -96,8 +98,8 @@ def _get_unknown_transactions(event: Event, job: BankImportJob, data: list): return transactions -@app.task(base=TransactionAwareTask) -def process_banktransfers(event: int, job: int, data: list) -> None: +@app.task(base=TransactionAwareTask, bind=True, max_retries=5, default_retry_delay=1) +def process_banktransfers(self, event: int, job: int, data: list) -> None: with language("en"): # We'll translate error messages at display time event = Event.objects.get(pk=event) job = BankImportJob.objects.get(pk=job) @@ -123,6 +125,13 @@ def process_banktransfers(event: int, job: int, data: list) -> None: else: trans.state = BankTransaction.STATE_NOMATCH trans.save() + except LockTimeoutException: + try: + self.retry() + except MaxRetriesExceededError: + logger.exception('Maximum number of retries exceeded for task.') + job.state = BankImportJob.STATE_ERROR + job.save() except Exception as e: job.state = BankImportJob.STATE_ERROR job.save()