From 677b99c71c5ae6b26f42a3e763dd72e2e702d82d Mon Sep 17 00:00:00 2001 From: moshego189 Date: Mon, 22 Jan 2024 19:51:50 +0200 Subject: [PATCH] fix: prevent memory leak in _redlock_release of SimpleMemoryBackend (#807) --- aiocache/backends/memory.py | 3 +-- tests/ut/backends/test_memory.py | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/aiocache/backends/memory.py b/aiocache/backends/memory.py index 7d75d7ee..a106d73c 100644 --- a/aiocache/backends/memory.py +++ b/aiocache/backends/memory.py @@ -93,8 +93,7 @@ async def _raw(self, command, *args, encoding="utf-8", _conn=None, **kwargs): async def _redlock_release(self, key, value): if self._cache.get(key) == value: - self._cache.pop(key) - return 1 + return self.__delete(key) return 0 def __delete(self, key): diff --git a/tests/ut/backends/test_memory.py b/tests/ut/backends/test_memory.py index ea99d560..59a8504f 100644 --- a/tests/ut/backends/test_memory.py +++ b/tests/ut/backends/test_memory.py @@ -173,9 +173,13 @@ async def test_raw(self, memory): async def test_redlock_release(self, memory): memory._cache.get.return_value = "lock" + fake = create_autospec(asyncio.TimerHandle, instance=True) + memory._handlers[Keys.KEY] = fake assert await memory._redlock_release(Keys.KEY, "lock") == 1 memory._cache.get.assert_called_with(Keys.KEY) - memory._cache.pop.assert_called_with(Keys.KEY) + memory._cache.pop.assert_called_with(Keys.KEY, None) + assert fake.cancel.call_count == 1 + assert Keys.KEY not in memory._handlers async def test_redlock_release_nokey(self, memory): memory._cache.get.return_value = None