diff --git a/CHANGES b/CHANGES index b0744c6038..429045f9a5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,4 @@ + * asyncio: Fix memory leak caused by hiredis (#2693) * Allow data to drain from async PythonParser when reading during a disconnect() * Use asyncio.timeout() instead of async_timeout.timeout() for python >= 3.11 (#2602) * Add test and fix async HiredisParser when reading during a disconnect() (#2349) diff --git a/redis/asyncio/connection.py b/redis/asyncio/connection.py index 58dcd66efb..59f75aa229 100644 --- a/redis/asyncio/connection.py +++ b/redis/asyncio/connection.py @@ -187,12 +187,13 @@ def __del__(self): except Exception: pass - def parse_error(self, response: str) -> ResponseError: + @classmethod + def parse_error(cls, response: str) -> ResponseError: """Parse an error response""" error_code = response.split(" ")[0] - if error_code in self.EXCEPTION_CLASSES: + if error_code in cls.EXCEPTION_CLASSES: response = response[len(error_code) + 1 :] - exception_class = self.EXCEPTION_CLASSES[error_code] + exception_class = cls.EXCEPTION_CLASSES[error_code] if isinstance(exception_class, dict): exception_class = exception_class.get(response, ResponseError) return exception_class(response) diff --git a/redis/connection.py b/redis/connection.py index 162a4c3215..eefdd96523 100644 --- a/redis/connection.py +++ b/redis/connection.py @@ -158,12 +158,13 @@ class BaseParser: "NOPERM": NoPermissionError, } - def parse_error(self, response): + @classmethod + def parse_error(cls, response): "Parse an error response" error_code = response.split(" ")[0] - if error_code in self.EXCEPTION_CLASSES: + if error_code in cls.EXCEPTION_CLASSES: response = response[len(error_code) + 1 :] - exception_class = self.EXCEPTION_CLASSES[error_code] + exception_class = cls.EXCEPTION_CLASSES[error_code] if isinstance(exception_class, dict): exception_class = exception_class.get(response, ResponseError) return exception_class(response)