From edaf0779edd995e13b657f3e3748e73c917c2b0d Mon Sep 17 00:00:00 2001 From: laixintao Date: Wed, 30 Sep 2020 21:36:09 +0800 Subject: [PATCH] bugfix: when set config result_expires = 0, chord.get will hang. (#6373) * bugfix: when set config result_expires = 0, chord.get will hang. `EXPIRE key 0` will delete a key in redis, then chord will never get the result. fix: https://github.com/celery/celery/issues/5237 * test: add testcase for expire when set config with zero. --- t/unit/backends/test_redis.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/t/unit/backends/test_redis.py b/t/unit/backends/test_redis.py index 223df977317..6f14b456410 100644 --- a/t/unit/backends/test_redis.py +++ b/t/unit/backends/test_redis.py @@ -713,6 +713,24 @@ def test_on_chord_part_return_expire_set_to_zero(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(