From 6a34613094bfebbbe5e2813a17bc89eea25f504f Mon Sep 17 00:00:00 2001 From: Andrew Chen Wang <60190294+Andrew-Chen-Wang@users.noreply.github.com> Date: Wed, 1 Dec 2021 23:01:28 -0500 Subject: [PATCH 1/6] Remove __del__ from Redis (Fixes #1115) --- aioredis/client.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/aioredis/client.py b/aioredis/client.py index aa8fbd727..41a5bb91f 100644 --- a/aioredis/client.py +++ b/aioredis/client.py @@ -1054,16 +1054,6 @@ async def __aenter__(self: _RedisT) -> _RedisT: async def __aexit__(self, exc_type, exc_value, traceback): await self.close() - def __del__(self): - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - loop.create_task(self.close()) - else: - loop.run_until_complete(self.close()) - except Exception: - pass - async def close(self): conn = self.connection if conn: From 40b7f269328e6811def06efc21934b399778dcf5 Mon Sep 17 00:00:00 2001 From: Andrew Chen Wang <60190294+Andrew-Chen-Wang@users.noreply.github.com> Date: Wed, 1 Dec 2021 23:02:37 -0500 Subject: [PATCH 2/6] Create 1227.bug --- CHANGES/1227.bug | 1 + 1 file changed, 1 insertion(+) create mode 100644 CHANGES/1227.bug diff --git a/CHANGES/1227.bug b/CHANGES/1227.bug new file mode 100644 index 000000000..8b83dfc25 --- /dev/null +++ b/CHANGES/1227.bug @@ -0,0 +1 @@ +Delete `__del__` from Redis (Fixes #1115) From 329923d32f9766f11fd2f66f86e54877b8acc34b Mon Sep 17 00:00:00 2001 From: Andrew Chen Wang <60190294+Andrew-Chen-Wang@users.noreply.github.com> Date: Wed, 1 Dec 2021 23:03:16 -0500 Subject: [PATCH 3/6] Rename 1227.bug to 1227.bugfix --- CHANGES/{1227.bug => 1227.bugfix} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename CHANGES/{1227.bug => 1227.bugfix} (100%) diff --git a/CHANGES/1227.bug b/CHANGES/1227.bugfix similarity index 100% rename from CHANGES/1227.bug rename to CHANGES/1227.bugfix From 01c26a9b244337a5a85d0c3f919d72161fe438e5 Mon Sep 17 00:00:00 2001 From: Andrew Chen Wang <60190294+Andrew-Chen-Wang@users.noreply.github.com> Date: Wed, 1 Dec 2021 23:05:44 -0500 Subject: [PATCH 4/6] Delete pipeline __del__ --- aioredis/client.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/aioredis/client.py b/aioredis/client.py index 41a5bb91f..38634cf8a 100644 --- a/aioredis/client.py +++ b/aioredis/client.py @@ -4339,17 +4339,6 @@ async def __aexit__(self, exc_type, exc_value, traceback): def __await__(self): return self._async_self().__await__() - def __del__(self): - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - loop.create_task(self.reset()) - else: - loop.run_until_complete(self.reset()) - super().__del__() - except Exception: - pass - def __len__(self): return len(self.command_stack) From cb028e9f43eea55bb9972873a836cb3b1e9d87c2 Mon Sep 17 00:00:00 2001 From: Andrew-Chen-Wang Date: Wed, 15 Dec 2021 12:55:06 -0500 Subject: [PATCH 5/6] Raise ResourceWarning on __del__ for Redis --- CHANGES/1227.bugfix | 2 +- aioredis/client.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGES/1227.bugfix b/CHANGES/1227.bugfix index 8b83dfc25..6fef29859 100644 --- a/CHANGES/1227.bugfix +++ b/CHANGES/1227.bugfix @@ -1 +1 @@ -Delete `__del__` from Redis (Fixes #1115) +Change `__del__` in Redis to raise ResourceWarning (Fixes #1115) diff --git a/aioredis/client.py b/aioredis/client.py index 38634cf8a..02f6d2e80 100644 --- a/aioredis/client.py +++ b/aioredis/client.py @@ -1054,6 +1054,25 @@ async def __aenter__(self: _RedisT) -> _RedisT: async def __aexit__(self, exc_type, exc_value, traceback): await self.close() + _DEL_MESSAGE = "Unclosed Redis client" + + def __del__(self, _warnings: Any = warnings) -> None: + try: + if self.connection is not None: + _warnings.warn( + f"Unclosed client session {self!r}", + ResourceWarning, + source=self, + ) + context = {"client": self, "message": self._DEL_MESSAGE} + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + except AttributeError: + # loop was not initialized yet, + # either self._connector or self._loop doesn't exist + pass + async def close(self): conn = self.connection if conn: @@ -4339,6 +4358,8 @@ async def __aexit__(self, exc_type, exc_value, traceback): def __await__(self): return self._async_self().__await__() + _DEL_MESSAGE = "Unclosed Pipeline client" + def __len__(self): return len(self.command_stack) From a121f9a75ee2ef031ed0d7f1e213ef31c1d5c362 Mon Sep 17 00:00:00 2001 From: Andrew-Chen-Wang Date: Wed, 15 Dec 2021 13:39:16 -0500 Subject: [PATCH 6/6] Removed irrelevant/unnecessary code * Fixed getting proper event loop --- aioredis/client.py | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/aioredis/client.py b/aioredis/client.py index 02f6d2e80..d2f49ab22 100644 --- a/aioredis/client.py +++ b/aioredis/client.py @@ -1057,21 +1057,14 @@ async def __aexit__(self, exc_type, exc_value, traceback): _DEL_MESSAGE = "Unclosed Redis client" def __del__(self, _warnings: Any = warnings) -> None: - try: - if self.connection is not None: - _warnings.warn( - f"Unclosed client session {self!r}", - ResourceWarning, - source=self, - ) - context = {"client": self, "message": self._DEL_MESSAGE} - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - except AttributeError: - # loop was not initialized yet, - # either self._connector or self._loop doesn't exist - pass + if self.connection is not None: + _warnings.warn( + f"Unclosed client session {self!r}", + ResourceWarning, + source=self, + ) + context = {"client": self, "message": self._DEL_MESSAGE} + asyncio.get_event_loop().call_exception_handler(context) async def close(self): conn = self.connection