diff --git a/celery/backends/redis.py b/celery/backends/redis.py index 1b9db7433f..2c42882353 100644 --- a/celery/backends/redis.py +++ b/celery/backends/redis.py @@ -436,7 +436,7 @@ def on_chord_part_return(self, request, state, result, if self._chord_zset else pipe.rpush(jkey, encoded).llen(jkey) ).get(tkey) - if self.expires is not None: + if self.expires: pipeline = pipeline \ .expire(jkey, self.expires) \ .expire(tkey, self.expires) diff --git a/t/unit/backends/test_redis.py b/t/unit/backends/test_redis.py index 3f6257c8ae..2029edc3c2 100644 --- a/t/unit/backends/test_redis.py +++ b/t/unit/backends/test_redis.py @@ -712,6 +712,24 @@ def test_on_chord_part_return_no_expiry(self, restore): self.b.expires = old_expires + @patch('celery.result.GroupResult.restore') + def test_on_chord_part_return_expire_set_to_zero(self, restore): + old_expires = self.b.expires + self.b.expires = 0 + tasks = [self.create_task(i) for i in range(10)] + + for i in range(10): + self.b.on_chord_part_return(tasks[i].request, states.SUCCESS, i) + assert self.b.client.zadd.call_count + self.b.client.zadd.reset_mock() + assert self.b.client.zrangebyscore.call_count + jkey = self.b.get_key_for_group('group_id', '.j') + tkey = self.b.get_key_for_group('group_id', '.t') + self.b.client.delete.assert_has_calls([call(jkey), call(tkey)]) + self.b.client.expire.assert_not_called() + + self.b.expires = old_expires + @patch('celery.result.GroupResult.restore') def test_on_chord_part_return_no_expiry__unordered(self, restore): self.app.conf.result_backend_transport_options = dict(