From 4d4799014771745b0337b117b1ca8c5239b92813 Mon Sep 17 00:00:00 2001 From: Joe Alcorn Date: Wed, 2 Sep 2015 17:29:31 +0100 Subject: [PATCH] Ensure retries work are allowed to be queued --- README.md | 2 +- celery_dedupe/tasks.py | 4 ++++ tests/test_task.py | 11 +++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ab7afbe..abc8f53 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ def noop_task(*a, **kw): # Things to look out for -- Tasks with an ETA or countdown +- Tasks with an ETA, countdown or retry delays - Unregistered tasks - Unacknowledged tasks - Manually purging your broker diff --git a/celery_dedupe/tasks.py b/celery_dedupe/tasks.py index df1cbb0..955d918 100644 --- a/celery_dedupe/tasks.py +++ b/celery_dedupe/tasks.py @@ -18,6 +18,10 @@ def apply_async(self, args=None, kwargs=None, **kw): return super(DedupeTask, self).apply_async(args=args, kwargs=kwargs, **kw) existing_task_id = self.storage.get(key) + if existing_task_id == task_id: + # This should be a retry, so add it to the broker anyway + return super(DedupeTask, self).apply_async(args=args, kwargs=kwargs, **kw) + app = self._get_app() if app.conf.CELERY_ALWAYS_EAGER: warnings.warn('Using DedupeTask in conjunction with CELERY_ALWAYS_EAGER, can not return EagerResult') diff --git a/tests/test_task.py b/tests/test_task.py index 28c0b79..2f402f6 100644 --- a/tests/test_task.py +++ b/tests/test_task.py @@ -20,6 +20,13 @@ def raise_exception(self, *a, **kw): raise AttributeError() +@task(base=DedupeTask, storage=storage, bind=True) +def retry_task(self, *a, **kw): + if self.request.retries == 0: + self.retry(countdown=0) + return True + + class TestDedupeTask(object): def setup_class(self): @@ -64,3 +71,7 @@ def test_key_cleared_on_exception(self): assert False assert not redis.exists(key) + + def test_task_retry(self): + result = retry_task.delay() + assert result.get()