From 6e0aa804a41e84739ca549738af5c9d9296ca9f2 Mon Sep 17 00:00:00 2001 From: Sebastian Jakob Date: Mon, 3 Jul 2023 16:13:17 +0200 Subject: [PATCH 1/3] Ensure triggering of callback in chord If one task for whatever reason is executed twice the callback is never triggered because the chord will be deleted and the before the last task is executed. The last task then will raise a warning that the chord cant be found. --- django_celery_results/backends/database.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/django_celery_results/backends/database.py b/django_celery_results/backends/database.py index 7353bc6f..5d9f1b6f 100644 --- a/django_celery_results/backends/database.py +++ b/django_celery_results/backends/database.py @@ -265,7 +265,6 @@ def on_chord_part_return(self, request, state, result, **kwargs): else: # Last task in the chord header has finished call_callback = True - chord_counter.delete() if call_callback: deps = chord_counter.group_result(app=self.app) @@ -276,6 +275,9 @@ def on_chord_part_return(self, request, state, result, **kwargs): callback=callback, group_result=deps ) + chord_counter.delete() + else: + logger.warning("ChordCounter for Group %s 0 but not ready yet.", gid) def trigger_callback(app, callback, group_result): From 90344aa915992769ee069caf071cd884d2f4ee00 Mon Sep 17 00:00:00 2001 From: Sebastian Jakob Date: Mon, 3 Jul 2023 16:16:41 +0200 Subject: [PATCH 2/3] Fixing line length --- django_celery_results/backends/database.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/django_celery_results/backends/database.py b/django_celery_results/backends/database.py index 5d9f1b6f..a7eb6e43 100644 --- a/django_celery_results/backends/database.py +++ b/django_celery_results/backends/database.py @@ -277,7 +277,8 @@ def on_chord_part_return(self, request, state, result, **kwargs): ) chord_counter.delete() else: - logger.warning("ChordCounter for Group %s 0 but not ready yet.", gid) + logger.warning("ChordCounter for Group %s 0 " + "but not ready yet.", gid) def trigger_callback(app, callback, group_result): From 1b04c887c57c7a12a85688cc4d0aeda378d89bee Mon Sep 17 00:00:00 2001 From: Sebastian Jakob Date: Tue, 30 Apr 2024 17:44:50 +0200 Subject: [PATCH 3/3] update message fixing unit test --- django_celery_results/backends/database.py | 4 ++-- t/unit/backends/test_database.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/django_celery_results/backends/database.py b/django_celery_results/backends/database.py index a7eb6e43..a218b2b7 100644 --- a/django_celery_results/backends/database.py +++ b/django_celery_results/backends/database.py @@ -277,8 +277,8 @@ def on_chord_part_return(self, request, state, result, **kwargs): ) chord_counter.delete() else: - logger.warning("ChordCounter for Group %s 0 " - "but not ready yet.", gid) + logger.warning("Chord %s executed more " + "tasks than expected", gid) def trigger_callback(app, callback, group_result): diff --git a/t/unit/backends/test_database.py b/t/unit/backends/test_database.py index ef1e8e26..e881440e 100644 --- a/t/unit/backends/test_database.py +++ b/t/unit/backends/test_database.py @@ -862,8 +862,8 @@ def test_on_chord_part_return_failure(self): request.id = tid2 self.b.mark_as_failure(tid2, ValueError(), request=request) - with pytest.raises(ChordCounter.DoesNotExist): - ChordCounter.objects.get(group_id=gid) + chord_counter.refresh_from_db() + assert chord_counter.count == 1 request.chord.delay.assert_not_called()