redis/hiredis-py

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