Skip to content

Memory leak on hgetall with RESP3 and hiredis #175

@HarukaMa

Description

@HarukaMa

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions