From 5c851f1d28d37108908025a29017497950069414 Mon Sep 17 00:00:00 2001 From: Anas Date: Mon, 18 Apr 2022 11:21:54 +0300 Subject: [PATCH 1/8] Added blocking parameter to lock --- django_redis/client/default.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/django_redis/client/default.py b/django_redis/client/default.py index 1df90a27..ac01a531 100644 --- a/django_redis/client/default.py +++ b/django_redis/client/default.py @@ -338,9 +338,10 @@ def lock( self, key, version: Optional[int] = None, - timeout=None, - sleep=0.1, - blocking_timeout=None, + timeout: Optional[float] = None, + sleep: float = 0.1, + blocking: bool = True, + blocking_timeout: Optional[float] = None, client: Optional[Redis] = None, thread_local=True, ): @@ -352,6 +353,7 @@ def lock( key, timeout=timeout, sleep=sleep, + blocking=blocking, blocking_timeout=blocking_timeout, thread_local=thread_local, ) From 1b225fe4f9ddd89b3ef9005751cb06a700dcee99 Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 17:47:09 +0300 Subject: [PATCH 2/8] Added blocking parameter to lock --- django_redis/client/default.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/django_redis/client/default.py b/django_redis/client/default.py index b9a5c1b0..f6fd23bb 100644 --- a/django_redis/client/default.py +++ b/django_redis/client/default.py @@ -374,6 +374,7 @@ def lock( version: Optional[int] = None, timeout: Optional[float] = None, sleep: float = 0.1, + blocking: bool = True, blocking_timeout: Optional[float] = None, client: Optional[Redis] = None, thread_local: bool = True, @@ -386,6 +387,7 @@ def lock( key, timeout=timeout, sleep=sleep, + blocking=blocking, blocking_timeout=blocking_timeout, thread_local=thread_local, ) From 277f2eb07d7d49a895ac7b6de0ce4b2e5a483e55 Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 18:11:22 +0300 Subject: [PATCH 3/8] Added tests for not blocking lock timeout --- tests/test_backend.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_backend.py b/tests/test_backend.py index 4ff60983..1714996a 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -677,7 +677,19 @@ def test_expire_at(self, cache: RedisCache): def test_lock(self, cache: RedisCache): lock = cache.lock("foobar") - lock.acquire(blocking=True) + assert lock.acquire(blocking=True) + + assert cache.has_key("foobar") + lock.release() + assert not cache.has_key("foobar") + + def test_lock_not_blocking(self, cache: RedisCache): + lock = cache.lock("foobar") + assert lock.acquire(blocking=False) + + lock2 = cache.lock("foobar") + + assert not lock2.acquire(blocking=False) assert cache.has_key("foobar") lock.release() @@ -685,7 +697,7 @@ def test_lock(self, cache: RedisCache): def test_lock_released_by_thread(self, cache: RedisCache): lock = cache.lock("foobar", thread_local=False) - lock.acquire(blocking=True) + assert lock.acquire(blocking=True) def release_lock(lock_): lock_.release() From 9cecd04a7125158cb2b196e5f18a6b8a308a7f93 Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 17:47:09 +0300 Subject: [PATCH 4/8] Added blocking parameter to lock --- django_redis/client/default.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/django_redis/client/default.py b/django_redis/client/default.py index 3219f7c9..1c34e5ac 100644 --- a/django_redis/client/default.py +++ b/django_redis/client/default.py @@ -393,6 +393,7 @@ def lock( version: Optional[int] = None, timeout: Optional[float] = None, sleep: float = 0.1, + blocking: bool = True, blocking_timeout: Optional[float] = None, client: Optional[Redis] = None, thread_local: bool = True, @@ -405,6 +406,7 @@ def lock( key, timeout=timeout, sleep=sleep, + blocking=blocking, blocking_timeout=blocking_timeout, thread_local=thread_local, ) From b45d68df33505616e6059e4c350068b3a7b287fd Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 18:11:22 +0300 Subject: [PATCH 5/8] Added tests for not blocking lock timeout --- tests/test_backend.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_backend.py b/tests/test_backend.py index 8619931e..e5c54e18 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -677,7 +677,19 @@ def test_expire_at(self, cache: RedisCache): def test_lock(self, cache: RedisCache): lock = cache.lock("foobar") - lock.acquire(blocking=True) + assert lock.acquire(blocking=True) + + assert cache.has_key("foobar") + lock.release() + assert not cache.has_key("foobar") + + def test_lock_not_blocking(self, cache: RedisCache): + lock = cache.lock("foobar") + assert lock.acquire(blocking=False) + + lock2 = cache.lock("foobar") + + assert not lock2.acquire(blocking=False) assert cache.has_key("foobar") lock.release() @@ -685,7 +697,7 @@ def test_lock(self, cache: RedisCache): def test_lock_released_by_thread(self, cache: RedisCache): lock = cache.lock("foobar", thread_local=False) - lock.acquire(blocking=True) + assert lock.acquire(blocking=True) def release_lock(lock_): lock_.release() From 95df61940c4bd8d23d9fd52cbeab50286d28f8d9 Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 18:36:13 +0300 Subject: [PATCH 6/8] Added CHANGELOG --- changelog.d/752.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/752.bugfix diff --git a/changelog.d/752.bugfix b/changelog.d/752.bugfix new file mode 100644 index 00000000..68c94278 --- /dev/null +++ b/changelog.d/752.bugfix @@ -0,0 +1 @@ +Added blocking parameter for `cache.lock` \ No newline at end of file From 17b4a50a7b1a55e302634f98f6ac440ba7b12bb2 Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 18:37:27 +0300 Subject: [PATCH 7/8] Added simplification --- django_redis/client/herd.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/django_redis/client/herd.py b/django_redis/client/herd.py index 94d539cd..c5c6d7d8 100644 --- a/django_redis/client/herd.py +++ b/django_redis/client/herd.py @@ -26,9 +26,7 @@ def _is_expired(x, herd_timeout: int) -> bool: return True val = x + random.randint(1, herd_timeout) - if val >= herd_timeout: - return True - return False + return val >= herd_timeout class HerdClient(DefaultClient): From 673064a2a0610e9ce5e84cdaed8e9429a826c09d Mon Sep 17 00:00:00 2001 From: WisdomPill Date: Sun, 20 Oct 2024 18:39:55 +0300 Subject: [PATCH 8/8] Fixed types --- django_redis/client/default.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/django_redis/client/default.py b/django_redis/client/default.py index 1c34e5ac..940e1a0e 100644 --- a/django_redis/client/default.py +++ b/django_redis/client/default.py @@ -326,9 +326,7 @@ def expire( key = self.make_key(key, version=version) - # for some strange reason mypy complains, - # saying that timeout type is float | timedelta - return client.expire(key, timeout) # type: ignore + return client.expire(key, timeout) def pexpire( self, @@ -345,11 +343,7 @@ def pexpire( key = self.make_key(key, version=version) - # Temporary casting until https://github.com/redis/redis-py/issues/1664 - # is fixed. - # for some strange reason mypy complains, - # saying that timeout type is float | timedelta - return bool(client.pexpire(key, timeout)) # type: ignore + return bool(client.pexpire(key, timeout)) def pexpire_at( self,