Skip to content

Commit 255f639

Browse files
Merge pull request #17 from mbleandro/main
make release lock script idempotent on missing key
2 parents 14f01e2 + 63e3e16 commit 255f639

File tree

3 files changed

+28
-16
lines changed

3 files changed

+28
-16
lines changed

src/yapcache/__init__.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
1-
import sys
21
import asyncio
32
from dataclasses import dataclass
43
from functools import wraps
54
from typing import Generic
6-
7-
if sys.version_info >= (3, 11):
8-
from enum import StrEnum
9-
else:
10-
from enum import Enum
11-
12-
class StrEnum(str, Enum):
13-
def __str__(self):
14-
return str(self.value)
5+
from compat import StrEnum
156

167

178
from typing_extensions import (

src/yapcache/compat.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import sys
2+
3+
4+
if sys.version_info >= (3, 11):
5+
from enum import StrEnum
6+
else:
7+
from enum import Enum
8+
9+
class StrEnum(str, Enum):
10+
def __str__(self):
11+
return str(self.value)

src/yapcache/distlock.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33

44
from redis.asyncio import Redis
55
from typing_extensions import override
6+
from compat import StrEnum
7+
8+
9+
class ReleasedLock(StrEnum):
10+
RELEASED = "released"
11+
NOT_FOUND = "not_found"
12+
UNMATCH = "unmatch"
613

714

815
class DistLock:
@@ -28,11 +35,14 @@ async def release(self):
2835

2936

3037
class RedisDistLock(DistLock):
31-
RELEASE_LOCK_SCRIPT = """
32-
if redis.call("get", KEYS[1]) == ARGV[1] then
33-
return redis.call("del", KEYS[1])
38+
RELEASE_LOCK_SCRIPT = f"""
39+
if redis.call("get", KEYS[1]) == false then
40+
return {ReleasedLock.NOT_FOUND}
41+
elseif redis.call("get", KEYS[1]) == ARGV[1] then
42+
redis.call("del", KEYS[1])
43+
return {ReleasedLock.RELEASED}
3444
else
35-
return 0
45+
return {ReleasedLock.UNMATCH}
3646
end
3747
"""
3848

@@ -83,10 +93,10 @@ async def _acquire(self):
8393

8494
@override
8595
async def release(self):
86-
released = await self.client.eval(
96+
release_result = await self.client.eval(
8797
self.RELEASE_LOCK_SCRIPT, 1, self.resource_name, self.lock_id
8898
) # type: ignore
89-
if released:
99+
if release_result in (ReleasedLock.RELEASED, ReleasedLock.NOT_FOUND):
90100
try:
91101
RedisDistLock._EVENTS.pop(self.resource_name).set()
92102
except KeyError:

0 commit comments

Comments
 (0)