Skip to content

Commit 22cae1b

Browse files
Adds periodic cleanup task for project documents
Introduces a background job that regularly prunes project documents from Redis, improving resource management and preventing data accumulation. Integrates the new cleanup routine into the existing garbage collector plugin.
1 parent e4b4a0b commit 22cae1b

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""
2+
Scheduled tasks addressing users
3+
4+
"""
5+
6+
import logging
7+
from collections.abc import AsyncIterator
8+
from datetime import timedelta
9+
10+
from aiohttp import web
11+
from servicelib.background_task_utils import exclusive_periodic
12+
from servicelib.logging_utils import log_context
13+
14+
from ..projects import projects_documents_service
15+
from ..redis import get_redis_lock_manager_client_sdk
16+
from ._tasks_utils import CleanupContextFunc, periodic_task_lifespan
17+
18+
_logger = logging.getLogger(__name__)
19+
20+
21+
def create_background_task_to_prune_documents(wait_s: float) -> CleanupContextFunc:
22+
23+
async def _cleanup_ctx_fun(app: web.Application) -> AsyncIterator[None]:
24+
interval = timedelta(seconds=wait_s)
25+
26+
@exclusive_periodic(
27+
# Function-exclusiveness is required to avoid multiple tasks like thisone running concurrently
28+
get_redis_lock_manager_client_sdk(app),
29+
task_interval=interval,
30+
retry_after=min(timedelta(seconds=10), interval / 10),
31+
)
32+
async def _prune_documents_periodically() -> None:
33+
with log_context(
34+
_logger,
35+
logging.INFO,
36+
"Deleting project documents in Redis `documents` table started",
37+
):
38+
await projects_documents_service.remove_project_documents_as_admin(app)
39+
40+
async for _ in periodic_task_lifespan(app, _prune_documents_periodically):
41+
yield
42+
43+
return _cleanup_ctx_fun

services/web/server/src/simcore_service_webserver/garbage_collector/plugin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ..projects._projects_repository_legacy import setup_projects_db
1111
from ..redis import setup_redis
1212
from ..socketio.plugin import setup_socketio
13-
from . import _tasks_api_keys, _tasks_core, _tasks_trash, _tasks_users
13+
from . import _tasks_api_keys, _tasks_core, _tasks_documents, _tasks_trash, _tasks_users
1414
from .settings import get_plugin_settings
1515

1616
_logger = logging.getLogger(__name__)
@@ -66,3 +66,8 @@ def setup_garbage_collector(app: web.Application) -> None:
6666
app.cleanup_ctx.append(
6767
_tasks_trash.create_background_task_to_prune_trash(wait_period_s)
6868
)
69+
70+
wait_period_s = 600
71+
app.cleanup_ctx.append(
72+
_tasks_documents.create_background_task_to_prune_documents(wait_period_s)
73+
)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,6 @@ async def _create_project_document_and_increment_version() -> (
8484
return project_document, document_version
8585

8686
return await _create_project_document_and_increment_version()
87+
88+
89+
async def remove_project_documents_as_admin(app: web.Application) -> None: ...
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from ._project_document_service import (
2+
remove_project_documents_as_admin,
3+
)
4+
5+
__all__: tuple[str, ...] = ("remove_project_documents_as_admin",)
6+
7+
8+
# nopycln: file

0 commit comments

Comments
 (0)