66from models_library .projects_access import Owner
77from models_library .projects_state import ProjectLocked , ProjectStatus
88
9- from . import CouldNotAcquireLockError , RedisClientSDK , exclusive
10- from ._errors import ProjectLockError
9+ from ._client import RedisClientSDK
10+ from ._decorators import exclusive
11+ from ._errors import CouldNotAcquireLockError , ProjectLockError
1112
12- PROJECT_REDIS_LOCK_KEY : Final [str ] = "project_lock:{}"
13+ _PROJECT_REDIS_LOCK_KEY : Final [str ] = "project_lock:{}"
1314
1415
1516P = ParamSpec ("P" )
@@ -25,14 +26,28 @@ def with_project_locked(
2526) -> Callable [
2627 [Callable [P , Coroutine [Any , Any , R ]]], Callable [P , Coroutine [Any , Any , R ]]
2728]:
29+ """creates a distributed auto sustained Redis lock for project with project_uuid, keeping its status and owner in the lock data
30+
31+ Arguments:
32+ redis_client -- the client to use to access redis
33+ project_uuid -- the project UUID
34+ status -- the project status
35+
36+ Keyword Arguments:
37+ owner -- the owner of the lock (default: {None})
38+
39+ Returns:
40+ the decorated function return value
41+ """
42+
2843 def _decorator (
2944 func : Callable [P , Coroutine [Any , Any , R ]],
3045 ) -> Callable [P , Coroutine [Any , Any , R ]]:
3146 @functools .wraps (func )
3247 async def _wrapper (* args : P .args , ** kwargs : P .kwargs ) -> R :
3348 @exclusive (
3449 redis_client ,
35- lock_key = PROJECT_REDIS_LOCK_KEY .format (project_uuid ),
50+ lock_key = _PROJECT_REDIS_LOCK_KEY .format (project_uuid ),
3651 lock_value = ProjectLocked (
3752 value = True ,
3853 owner = owner ,
@@ -55,7 +70,7 @@ async def _exclusive_func(*args, **kwargs) -> R:
5570async def is_project_locked (
5671 redis_client : RedisClientSDK , project_uuid : str | ProjectID
5772) -> bool :
58- redis_lock = redis_client .create_lock (PROJECT_REDIS_LOCK_KEY .format (project_uuid ))
73+ redis_lock = redis_client .create_lock (_PROJECT_REDIS_LOCK_KEY .format (project_uuid ))
5974 return await redis_lock .locked ()
6075
6176
@@ -68,7 +83,7 @@ async def get_project_locked_state(
6883 """
6984 if await is_project_locked (redis_client , project_uuid = project_uuid ) and (
7085 lock_value := await redis_client .redis .get (
71- PROJECT_REDIS_LOCK_KEY .format (project_uuid )
86+ _PROJECT_REDIS_LOCK_KEY .format (project_uuid )
7287 )
7388 ):
7489 return ProjectLocked .model_validate_json (lock_value )
0 commit comments