Skip to content

Commit 77ac6cd

Browse files
committed
separating dependencies
1 parent ee5d033 commit 77ac6cd

File tree

6 files changed

+53
-62
lines changed

6 files changed

+53
-62
lines changed

packages/service-library/src/servicelib/redis/_project_lock.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import functools
2-
from collections.abc import Callable, Coroutine
2+
from collections.abc import Awaitable, Callable, Coroutine
33
from typing import Any, Final, ParamSpec, TypeVar
44

55
from models_library.projects import ProjectID
@@ -67,6 +67,43 @@ async def _exclusive_func(*args, **kwargs) -> R:
6767
return _decorator
6868

6969

70+
def with_project_locked_and_notify(
71+
redis_client: RedisClientSDK | Callable[..., RedisClientSDK],
72+
*,
73+
project_uuid: str,
74+
status: ProjectStatus,
75+
owner: Owner,
76+
notification_cb: Callable[[], Awaitable[None]] | None,
77+
) -> Callable[
78+
[Callable[P, Coroutine[Any, Any, R]]], Callable[P, Coroutine[Any, Any, R]]
79+
]:
80+
def _decorator(
81+
func: Callable[P, Coroutine[Any, Any, R]],
82+
) -> Callable[P, Coroutine[Any, Any, R]]:
83+
@functools.wraps(func)
84+
async def _wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
85+
@with_project_locked(
86+
redis_client,
87+
project_uuid=project_uuid,
88+
status=status,
89+
owner=owner,
90+
)
91+
async def _locked_func() -> R:
92+
if notification_cb is not None:
93+
await notification_cb()
94+
95+
return await func(*args, **kwargs)
96+
97+
result = await _locked_func()
98+
if notification_cb is not None:
99+
await notification_cb()
100+
return result
101+
102+
return _wrapper
103+
104+
return _decorator
105+
106+
70107
async def is_project_locked(
71108
redis_client: RedisClientSDK, project_uuid: str | ProjectID
72109
) -> bool:

services/web/server/src/simcore_service_webserver/exporter/_handlers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from ..login.decorators import login_required
1616
from ..projects.api import with_project_locked_and_notify
1717
from ..projects.projects_api import retrieve_and_notify_project_locked_state
18+
from ..redis import get_redis_lock_manager_client_sdk
1819
from ..security.decorators import permission_required
1920
from ..users.api import get_user_fullname
2021
from ._formatter.archive import get_sds_archive_path
@@ -46,7 +47,7 @@ async def export_project(request: web.Request):
4647
assert project_uuid # nosec
4748

4849
@with_project_locked_and_notify(
49-
request.app,
50+
get_redis_lock_manager_client_sdk(request.app),
5051
project_uuid=project_uuid,
5152
status=ProjectStatus.EXPORTING,
5253
owner=Owner(

services/web/server/src/simcore_service_webserver/projects/_crud_api_create.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from pydantic import TypeAdapter
1919
from servicelib.aiohttp.long_running_tasks.server import TaskProgress
2020
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
21+
from servicelib.redis._project_lock import with_project_locked_and_notify
2122
from simcore_postgres_database.utils_projects_nodes import (
2223
ProjectNode,
2324
ProjectNodeCreate,
@@ -29,6 +30,7 @@
2930
from ..director_v2 import api as director_v2_api
3031
from ..dynamic_scheduler import api as dynamic_scheduler_api
3132
from ..folders import _folders_repository as folders_db
33+
from ..redis import get_redis_lock_manager_client_sdk
3234
from ..storage.api import (
3335
copy_data_folders_from_project,
3436
get_project_total_size_simcore_s3,
@@ -40,7 +42,6 @@
4042
from . import projects_api
4143
from ._metadata_api import set_project_ancestors
4244
from ._permalink_api import update_or_pop_permalink_in_project
43-
from ._projects_locks_utils import with_project_locked_and_notify
4445
from .db import ProjectDBAPI
4546
from .exceptions import (
4647
ParentNodeNotFoundError,
@@ -182,16 +183,20 @@ async def _copy() -> None:
182183
await long_running_task.result()
183184

184185
if needs_lock_source_project:
186+
187+
async def _notification_cb() -> None:
188+
await projects_api.retrieve_and_notify_project_locked_state(
189+
user_id, source_project["uuid"], app
190+
)
191+
185192
await with_project_locked_and_notify(
186-
app,
193+
get_redis_lock_manager_client_sdk(app),
187194
project_uuid=source_project["uuid"],
188195
status=ProjectStatus.CLONING,
189196
owner=Owner(
190197
user_id=user_id, **await get_user_fullname(app, user_id=user_id)
191198
),
192-
notification_cb=projects_api.retrieve_and_notify_project_locked_state(
193-
user_id, source_project["uuid"], app
194-
),
199+
notification_cb=_notification_cb,
195200
)(_copy)()
196201
else:
197202
await _copy()

services/web/server/src/simcore_service_webserver/projects/_projects_locks_utils.py

Lines changed: 0 additions & 50 deletions
This file was deleted.

services/web/server/src/simcore_service_webserver/projects/api.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
)
1212
from ._permalink_api import ProjectPermalink
1313
from ._permalink_api import register_factory as register_permalink_factory
14-
from ._projects_locks_utils import with_project_locked_and_notify
1514
from ._wallets_api import (
1615
check_project_financial_status,
1716
connect_wallet_to_project,
@@ -28,7 +27,6 @@
2827
"ProjectPermalink",
2928
"register_permalink_factory",
3029
"check_project_financial_status",
31-
"with_project_locked_and_notify",
3230
)
3331

3432

services/web/server/src/simcore_service_webserver/projects/projects_api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
)
8383
from servicelib.redis import get_project_locked_state, is_project_locked
8484
from servicelib.redis._decorators import exclusive
85+
from servicelib.redis._project_lock import with_project_locked_and_notify
8586
from servicelib.utils import fire_and_forget_task, logged_gather
8687
from simcore_postgres_database.models.users import UserRole
8788
from simcore_postgres_database.utils_projects_nodes import (
@@ -128,7 +129,6 @@
128129
)
129130
from ._db_utils import PermissionStr
130131
from ._nodes_utils import set_reservation_same_as_limit, validate_new_service_resources
131-
from ._projects_locks_utils import with_project_locked_and_notify
132132
from ._wallets_api import connect_wallet_to_project, get_project_wallet
133133
from .db import APP_PROJECT_DBAPI, ProjectDBAPI
134134
from .exceptions import (
@@ -1258,7 +1258,7 @@ async def try_open_project_for_user(
12581258
try:
12591259

12601260
@with_project_locked_and_notify(
1261-
app,
1261+
get_redis_lock_manager_client_sdk(app),
12621262
project_uuid=project_uuid,
12631263
status=ProjectStatus.OPENING,
12641264
owner=Owner(
@@ -1757,7 +1757,7 @@ async def remove_project_dynamic_services(
17571757
# -------------------
17581758

17591759
@with_project_locked_and_notify(
1760-
app,
1760+
get_redis_lock_manager_client_sdk(app),
17611761
project_uuid=project_uuid,
17621762
status=ProjectStatus.CLOSING,
17631763
owner=Owner(user_id=user_id, **user_name_data),

0 commit comments

Comments
 (0)