mirror of
https://github.com/d3vyce/taskiq-deduplication.git
synced 2026-08-04 19:14:07 +00:00
fix: lock leaks when sender and worker middlewares have different default_deduplication (#39)
This commit is contained in:
@@ -186,8 +186,6 @@ class RedisDeduplicationMiddleware(TaskiqMiddleware):
|
|||||||
return message
|
return message
|
||||||
|
|
||||||
async def _release_lock(self, message: TaskiqMessage) -> None:
|
async def _release_lock(self, message: TaskiqMessage) -> None:
|
||||||
if not self._is_enabled(message.labels):
|
|
||||||
return
|
|
||||||
key = self._get_cached_key(message)
|
key = self._get_cached_key(message)
|
||||||
if key is None:
|
if key is None:
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -261,6 +261,52 @@ class TestOnError:
|
|||||||
assert await fake_redis.exists(key)
|
assert await fake_redis.exists(key)
|
||||||
|
|
||||||
|
|
||||||
|
class TestSenderWorkerConfigMismatch:
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_post_execute_releases_lock_despite_worker_disabled_default(
|
||||||
|
self, fake_redis, make_message, make_result
|
||||||
|
):
|
||||||
|
sender_mw = RedisDeduplicationMiddleware(
|
||||||
|
redis_url="redis://localhost", default_deduplication=True
|
||||||
|
)
|
||||||
|
sender_mw._redis = fake_redis
|
||||||
|
|
||||||
|
worker_mw = RedisDeduplicationMiddleware(
|
||||||
|
redis_url="redis://localhost", default_deduplication=False
|
||||||
|
)
|
||||||
|
worker_mw._redis = fake_redis
|
||||||
|
|
||||||
|
msg = make_message()
|
||||||
|
await sender_mw.pre_send(msg)
|
||||||
|
key = sender_mw._build_deduplication_key(msg)
|
||||||
|
assert await fake_redis.exists(key)
|
||||||
|
|
||||||
|
await worker_mw.post_execute(msg, make_result())
|
||||||
|
assert not await fake_redis.exists(key)
|
||||||
|
|
||||||
|
@pytest.mark.anyio
|
||||||
|
async def test_on_error_releases_lock_despite_worker_disabled_default(
|
||||||
|
self, fake_redis, make_message, make_result
|
||||||
|
):
|
||||||
|
sender_mw = RedisDeduplicationMiddleware(
|
||||||
|
redis_url="redis://localhost", default_deduplication=True
|
||||||
|
)
|
||||||
|
sender_mw._redis = fake_redis
|
||||||
|
|
||||||
|
worker_mw = RedisDeduplicationMiddleware(
|
||||||
|
redis_url="redis://localhost", default_deduplication=False
|
||||||
|
)
|
||||||
|
worker_mw._redis = fake_redis
|
||||||
|
|
||||||
|
msg = make_message()
|
||||||
|
await sender_mw.pre_send(msg)
|
||||||
|
key = sender_mw._build_deduplication_key(msg)
|
||||||
|
assert await fake_redis.exists(key)
|
||||||
|
|
||||||
|
await worker_mw.on_error(msg, make_result(is_err=True), RuntimeError("boom"))
|
||||||
|
assert not await fake_redis.exists(key)
|
||||||
|
|
||||||
|
|
||||||
class TestRedispatchAfterRelease:
|
class TestRedispatchAfterRelease:
|
||||||
@pytest.mark.anyio
|
@pytest.mark.anyio
|
||||||
async def test_redispatch_after_post_execute(
|
async def test_redispatch_after_post_execute(
|
||||||
|
|||||||
Reference in New Issue
Block a user