hiredis-py icon indicating copy to clipboard operation
hiredis-py copied to clipboard

Memory leak on hgetall with RESP3 and hiredis

Open HarukaMa opened this issue 2 years ago • 3 comments

X-posting from https://github.com/redis/redis-py/issues/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)

HarukaMa avatar Nov 02 '23 11:11 HarukaMa

Looks like RESP3 usage has memory leaks for all commands that have map replies. I had it during streams and TS usage.

lemurchik avatar Dec 11 '23 14:12 lemurchik

Is there any interest in fixing this? I can give it a try but I need to know where to start looking.

InvisibleMan1306 avatar Mar 14 '24 16:03 InvisibleMan1306