Memory leak on hgetall with RESP3 and hiredis
HarukaMa opened this issue · 3 comments
X-posting from redis/redis-py#3025.
Version: Redis 7.0.13, redis-py 5.0.1, hiredis 2.2.3
Platform: Python 3.11.6 on Debian sid
Description:
When using hiredis with RESP3, hgetall
leaks memory. And it leaks hard - it seems all requested data will persistently live in the memory.
It's easy to reproduce:
from redis import Redis
r = Redis(protocol=3)
for _ in range(1000000):
r.hgetall("any_hash_key")
hget
and hvals
are fine, and when using RESP2 it works as intended as well.
Stack from memray (most recent call last):
return await conn.retry.call_with_retry(
return await do()
return await self.parse_response(conn, command_name, **options)
response = await connection.read_response()
response = await self._parser.read_response(
response = self._reader.gets()
All leaks happen on the last call. (Captured with program in production which uses async Redis, not from the example above)
Looks like RESP3 usage has memory leaks for all commands that have map replies. I had it during streams and TS usage.
Is there any interest in fixing this? I can give it a try but I need to know where to start looking.
Bump, could use a fix for this