Skip to content

Commit e603d0a

Browse files
fix: use caching
1 parent c3d9252 commit e603d0a

File tree

2 files changed

+49
-46
lines changed

2 files changed

+49
-46
lines changed

services/web/server/src/simcore_service_webserver/functions/_controller/_functions_rest.py

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717
RegisteredSolverFunction,
1818
)
1919
from models_library.products import ProductName
20-
from models_library.projects import ProjectID
2120
from models_library.rest_pagination import Page
2221
from models_library.rest_pagination_utils import paginate_data
23-
from models_library.services_types import ServiceKey, ServiceVersion
2422
from models_library.users import UserID
2523
from pydantic import TypeAdapter
2624
from servicelib.aiohttp import status
@@ -70,57 +68,49 @@ async def _build_function_access_rights(
7068
)
7169

7270

73-
async def _build_project_function_extras_dict(
74-
app: web.Application,
75-
*,
76-
user_id: UserID,
77-
function: RegisteredProjectFunction,
71+
def _build_project_function_extras_dict(
72+
project: ProjectDBGet,
7873
) -> dict[str, Any]:
79-
project_dict = await _projects_service.get_project_for_user(
80-
app=app,
81-
project_uuid=f"{function.project_id}",
82-
user_id=user_id,
83-
)
84-
8574
extras: dict[str, Any] = {}
86-
if thumbnail := project_dict["thumbnail"]:
75+
if thumbnail := project.thumbnail:
8776
extras["thumbnail"] = thumbnail
8877
return extras
8978

9079

91-
async def _build_solver_function_extras_dict(
92-
app: web.Application,
93-
*,
94-
function: RegisteredSolverFunction,
80+
def _build_solver_function_extras_dict(
81+
service_metadata: ServiceMetadata,
9582
) -> dict[str, Any]:
96-
services_metadata = await _services_metadata_proxy.get_service_metadata(
97-
app,
98-
key=function.solver_key,
99-
version=function.solver_version,
100-
)
83+
10184
extras: dict[str, Any] = {}
102-
if thumbnail := services_metadata.thumbnail:
85+
if thumbnail := service_metadata.thumbnail:
10386
extras["thumbnail"] = thumbnail
10487
return extras
10588

10689

10790
async def _build_function_extras(
108-
app: web.Application, user_id: UserID, *, function: RegisteredFunction
91+
app: web.Application, *, function: RegisteredFunction
10992
) -> dict[str, Any]:
11093
extras: dict[str, Any] = {}
11194
match function.function_class:
11295
case FunctionClass.PROJECT:
11396
assert isinstance(function, RegisteredProjectFunction)
114-
extras |= await _build_project_function_extras_dict(
115-
function=function,
97+
projects = await _projects_service.batch_get_projects(
11698
app=app,
117-
user_id=user_id,
99+
project_uuids=[function.project_id],
118100
)
101+
if project := projects.get(function.project_id):
102+
extras |= _build_project_function_extras_dict(
103+
project=project,
104+
)
119105
case FunctionClass.SOLVER:
120106
assert isinstance(function, RegisteredSolverFunction)
121-
extras |= await _build_solver_function_extras_dict(
107+
services_metadata = await _services_metadata_proxy.get_service_metadata(
122108
app,
123-
function=function,
109+
key=function.solver_key,
110+
version=function.solver_version,
111+
)
112+
extras |= _build_solver_function_extras_dict(
113+
service_metadata=services_metadata,
124114
)
125115
return extras
126116

@@ -178,10 +168,7 @@ async def list_functions(request: web.Request) -> web.Response:
178168

179169
chunk: list[RegisteredFunctionGet] = []
180170

181-
projects_cache: dict[ProjectID, ProjectDBGet] = {}
182-
service_metadata_cache: dict[tuple[ServiceKey, ServiceVersion], ServiceMetadata] = (
183-
{}
184-
)
171+
extras_map: dict[FunctionID, dict[str, Any]] = {}
185172

186173
if query_params.include_extras:
187174
if any(
@@ -192,10 +179,19 @@ async def list_functions(request: web.Request) -> web.Response:
192179
for function in functions
193180
if function.function_class == FunctionClass.PROJECT
194181
]
195-
projects_cache |= await _projects_service.batch_get_projects(
182+
projects_cache = await _projects_service.batch_get_projects(
196183
request.app,
197184
project_uuids=project_uuids,
198185
)
186+
for function in functions:
187+
if function.function_class == FunctionClass.PROJECT:
188+
project = projects_cache.get(function.project_id)
189+
if not project:
190+
continue
191+
extras_map[function.uid] = _build_project_function_extras_dict(
192+
project=project
193+
)
194+
199195
if any(
200196
function.function_class == FunctionClass.SOLVER for function in functions
201197
):
@@ -204,11 +200,21 @@ async def list_functions(request: web.Request) -> web.Response:
204200
for function in functions
205201
if function.function_class == FunctionClass.SOLVER
206202
}
207-
service_metadata_cache |= (
203+
service_metadata_cache = (
208204
await _services_metadata_proxy.batch_get_service_metadata(
209205
app=request.app, keys_and_versions=service_keys_and_versions
210206
)
211207
)
208+
for function in functions:
209+
if function.function_class == FunctionClass.SOLVER:
210+
service_metadata = service_metadata_cache.get(
211+
(function.solver_key, function.solver_version)
212+
)
213+
if not service_metadata:
214+
continue
215+
extras_map[function.uid] = _build_solver_function_extras_dict(
216+
service_metadata=service_metadata
217+
)
212218

213219
for function in functions:
214220
access_rights = await _build_function_access_rights(
@@ -218,13 +224,7 @@ async def list_functions(request: web.Request) -> web.Response:
218224
function_id=function.uid,
219225
)
220226

221-
extras = (
222-
await _build_function_extras(
223-
request.app, req_ctx.user_id, function=function
224-
)
225-
if query_params.include_extras
226-
else {}
227-
)
227+
extras = extras_map.get(function.uid, {})
228228

229229
chunk.append(
230230
TypeAdapter(RegisteredFunctionGet).validate_python(
@@ -275,7 +275,7 @@ async def get_function(request: web.Request) -> web.Response:
275275
)
276276

277277
extras = (
278-
await _build_function_extras(request.app, req_ctx.user_id, function=function)
278+
await _build_function_extras(request.app, function=function)
279279
if query_params.include_extras
280280
else {}
281281
)
@@ -323,7 +323,7 @@ async def update_function(request: web.Request) -> web.Response:
323323
)
324324

325325
extras = (
326-
await _build_function_extras(request.app, req_ctx.user_id, function=function)
326+
await _build_function_extras(request.app, function=function)
327327
if query_params.include_extras
328328
else {}
329329
)

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,10 @@ async def batch_get_projects(
183183
.where(projects.c.uuid.in_([f"{uuid}" for uuid in project_uuids]))
184184
)
185185
result = await conn.stream(query)
186-
return {row.uuid: ProjectDBGet.model_validate(row) async for row in result}
186+
return {
187+
ProjectID(row.uuid): ProjectDBGet.model_validate(row)
188+
async for row in result
189+
}
187190

188191

189192
def _select_trashed_by_primary_gid_query() -> sql.Select:

0 commit comments

Comments
 (0)