Skip to content

Commit 01db639

Browse files
fix: avoid binding loop for invalid cache keys (#740)
1 parent c6acbe8 commit 01db639

2 files changed

Lines changed: 26 additions & 3 deletions

File tree

async_lru/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,9 @@ async def __call__(self, /, *fn_args: Any, **fn_kwargs: Any) -> _R:
236236
raise RuntimeError(f"alru_cache is closed for {self}")
237237

238238
loop = asyncio.get_running_loop()
239-
self._check_loop(loop)
240-
241239
key = _make_key(fn_args, fn_kwargs, self.__typed)
242-
243240
cache_item = self.__cache.get(key)
241+
self._check_loop(loop)
244242

245243
if cache_item is not None:
246244
self._cache_hit(key)

tests/test_thread_safety.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,31 @@ async def cached_func(key: str) -> str:
2727
assert "event loop" in error_message.lower()
2828

2929

30+
def test_invalid_key_does_not_bind_loop() -> None:
31+
@alru_cache(maxsize=100)
32+
async def cached_func(key: object) -> str:
33+
return f"data_{key}"
34+
35+
loop1 = asyncio.new_event_loop()
36+
error_raised = False
37+
try:
38+
loop1.run_until_complete(cached_func([]))
39+
except TypeError:
40+
error_raised = True
41+
finally:
42+
loop1.close()
43+
44+
assert error_raised, "TypeError should be raised for unhashable key"
45+
46+
loop2 = asyncio.new_event_loop()
47+
try:
48+
result = loop2.run_until_complete(cached_func("ok"))
49+
finally:
50+
loop2.close()
51+
52+
assert result == "data_ok"
53+
54+
3055
def test_same_loop_access_works() -> None:
3156
@alru_cache(maxsize=100)
3257
async def cached_func(key: str) -> str:

0 commit comments

Comments
 (0)