diff --git a/backend/config/__init__.py b/backend/config/__init__.py index 6c3e87ed0..08fd564fa 100644 --- a/backend/config/__init__.py +++ b/backend/config/__init__.py @@ -123,6 +123,7 @@ OIDC_TLS_CACERTFILE: Final = os.environ.get("OIDC_TLS_CACERTFILE", None) SCAN_TIMEOUT: Final = int(os.environ.get("SCAN_TIMEOUT", 60 * 60 * 4)) # 4 hours # TASKS +TASK_TIMEOUT: Final = int(os.environ.get("TASK_TIMEOUT", 60 * 5)) # 5 minutes ENABLE_RESCAN_ON_FILESYSTEM_CHANGE: Final = str_to_bool( os.environ.get("ENABLE_RESCAN_ON_FILESYSTEM_CHANGE", "false") ) diff --git a/backend/endpoints/sockets/scan.py b/backend/endpoints/sockets/scan.py index d3fe5c7a9..f5e031f11 100644 --- a/backend/endpoints/sockets/scan.py +++ b/backend/endpoints/sockets/scan.py @@ -510,7 +510,7 @@ async def scan_platforms( if len(missed_platforms) > 0: log.warning(f"{hl('Missing')} platforms from filesystem:") for p in missed_platforms: - log.warning(f" - {p.slug}") + log.warning(f" - {p.slug} ({p.fs_slug})") log.info(f"{emoji.EMOJI_CHECK_MARK} Scan completed") await sm.emit("scan:done", scan_stats.__dict__) diff --git a/backend/endpoints/tasks.py b/backend/endpoints/tasks.py index f5d65c62f..016557afb 100644 --- a/backend/endpoints/tasks.py +++ b/backend/endpoints/tasks.py @@ -3,6 +3,7 @@ from datetime import datetime, timezone from config import ( ENABLE_RESCAN_ON_FILESYSTEM_CHANGE, RESCAN_ON_FILESYSTEM_CHANGE_DELAY, + TASK_TIMEOUT, ) from decorators.auth import protected_route from endpoints.responses import TaskExecutionResponse, TaskStatusResponse @@ -144,7 +145,7 @@ async def run_all_tasks(request: Request) -> list[TaskExecutionResponse]: ) jobs = [ - (task_name, low_prio_queue.enqueue(task_instance.run)) + (task_name, low_prio_queue.enqueue(task_instance.run, timeout=TASK_TIMEOUT)) for task_name, task_instance in runnable_tasks.items() ] @@ -185,7 +186,7 @@ async def run_single_task(request: Request, task_name: str) -> TaskExecutionResp detail=f"Task '{task_name}' cannot be run", ) - job = low_prio_queue.enqueue(task_instance.run) + job = low_prio_queue.enqueue(task_instance.run, timeout=TASK_TIMEOUT) return { "task_name": task_name, diff --git a/backend/tasks/tasks.py b/backend/tasks/tasks.py index 42e50c7c5..847e18b3a 100644 --- a/backend/tasks/tasks.py +++ b/backend/tasks/tasks.py @@ -2,6 +2,7 @@ from abc import ABC, abstractmethod from typing import Any import httpx +from config import TASK_TIMEOUT from exceptions.task_exceptions import SchedulerException from handler.redis_handler import low_prio_queue from logger.logger import log @@ -86,6 +87,7 @@ class PeriodicTask(Task, ABC): self.cron_string, func=self.func, repeat=None, + timeout=TASK_TIMEOUT, ) return None diff --git a/backend/watcher.py b/backend/watcher.py index ca211fb15..828158fcd 100644 --- a/backend/watcher.py +++ b/backend/watcher.py @@ -12,6 +12,7 @@ from config import ( LAUNCHBOX_API_ENABLED, LIBRARY_BASE_PATH, RESCAN_ON_FILESYSTEM_CHANGE_DELAY, + SCAN_TIMEOUT, SENTRY_DSN, ) from config.config_manager import config_manager as cm @@ -133,6 +134,7 @@ def process_changes(changes: Sequence[Change]) -> None: [], scan_type=ScanType.UNIDENTIFIED, metadata_sources=metadata_sources, + timeout=SCAN_TIMEOUT, ) return @@ -155,6 +157,7 @@ def process_changes(changes: Sequence[Change]) -> None: [db_platform.id], scan_type=ScanType.QUICK, metadata_sources=metadata_sources, + timeout=SCAN_TIMEOUT, ) diff --git a/env.template b/env.template index 5e62b5bd4..97e56614b 100644 --- a/env.template +++ b/env.template @@ -72,7 +72,8 @@ OIDC_SERVER_APPLICATION_URL= ENABLE_RESCAN_ON_FILESYSTEM_CHANGE=true RESCAN_ON_FILESYSTEM_CHANGE_DELAY=5 -# Periodic Tasks (optional) +# Tasks (optional) +TASK_TIMEOUT=300 ENABLE_SCHEDULED_RESCAN=true SCHEDULED_RESCAN_CRON=0 3 * * * ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB=true