From 01dd66ceb5b9167074c2f291b165055e7377641b Mon Sep 17 00:00:00 2001 From: Dmitry Nikulin Date: Sun, 1 Mar 2020 20:36:20 +0300 Subject: [PATCH] Fix chords with chained groups (#5947) --- celery/canvas.py | 2 ++ t/unit/tasks/test_canvas.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/celery/canvas.py b/celery/canvas.py index 8a9c1251683..4d154d615a9 100644 --- a/celery/canvas.py +++ b/celery/canvas.py @@ -1366,6 +1366,8 @@ def _traverse_tasks(self, tasks, value=None): task = stack.popleft() if isinstance(task, group): stack.extend(task.tasks) + elif isinstance(task, _chain) and isinstance(task.tasks[-1], group): + stack.extend(task.tasks[-1].tasks) else: yield task if value is None else value diff --git a/t/unit/tasks/test_canvas.py b/t/unit/tasks/test_canvas.py index e879ae1a917..5fad92d9d1e 100644 --- a/t/unit/tasks/test_canvas.py +++ b/t/unit/tasks/test_canvas.py @@ -742,6 +742,13 @@ def test_app_fallback_to_current(self): x = chord([t1], body=t1) assert x.app is current_app + def test_chord_size_with_groups(self): + x = chord([ + self.add.s(2, 2) | group([self.add.si(2, 2), self.add.si(2, 2)]), + self.add.s(2, 2) | group([self.add.si(2, 2), self.add.si(2, 2)]), + ], body=self.add.si(2, 2)) + assert x.__length_hint__() == 4 + def test_set_immutable(self): x = chord([Mock(name='t1'), Mock(name='t2')], app=self.app) x.set_immutable(True)