From 7040d0e4bd92911a9072226f49ad59ce575d6ed9 Mon Sep 17 00:00:00 2001 From: Jonas L Date: Sat, 13 Apr 2024 19:12:45 +0200 Subject: [PATCH] fix: trigger legacy tasks manager every 5m (#2987) ### Description This ensures that when the LibreTime interface is not used for a long time, we still have the task manager run essential tasks for the schedule. Related to #2670 --- Dockerfile | 2 ++ api-client/libretime_api_client/v1.py | 3 +++ worker/Makefile | 1 + .../install/systemd/libretime-worker.service | 1 + worker/libretime_worker/config.py | 1 + worker/libretime_worker/tasks.py | 23 +++++++++++++++++++ 6 files changed, 31 insertions(+) diff --git a/Dockerfile b/Dockerfile index cb8f1a5c5..5047ed674 100644 --- a/Dockerfile +++ b/Dockerfile @@ -189,6 +189,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile -r requirements.txt COPY --from=python-builder /build/shared/*.whl . +COPY --from=python-builder /build/api-client/*.whl . RUN --mount=type=cache,target=/root/.cache/pip \ pip install --no-compile *.whl && rm -Rf *.whl @@ -203,6 +204,7 @@ WORKDIR /app CMD ["/usr/local/bin/celery", "worker", \ "--app=libretime_worker.tasks:worker", \ "--config=libretime_worker.config", \ + "--beat", \ "--time-limit=1800", \ "--concurrency=1", \ "--loglevel=info"] diff --git a/api-client/libretime_api_client/v1.py b/api-client/libretime_api_client/v1.py index b5e4301a7..955dd6340 100644 --- a/api-client/libretime_api_client/v1.py +++ b/api-client/libretime_api_client/v1.py @@ -214,3 +214,6 @@ class ApiClient: def update_metadata_on_tunein(self): self._base_client.update_metadata_on_tunein() + + def trigger_task_manager(self): + self._base_client.version() diff --git a/worker/Makefile b/worker/Makefile index cecf2b4c5..03d0b0af1 100644 --- a/worker/Makefile +++ b/worker/Makefile @@ -3,6 +3,7 @@ all: lint test include ../tools/python.mk PIP_INSTALL := \ + --editable ../api-client \ --editable ../shared \ --editable .[dev,sentry] PYLINT_ARG := libretime_worker diff --git a/worker/install/systemd/libretime-worker.service b/worker/install/systemd/libretime-worker.service index 6a6d8c7da..65c728d8c 100644 --- a/worker/install/systemd/libretime-worker.service +++ b/worker/install/systemd/libretime-worker.service @@ -25,6 +25,7 @@ WorkingDirectory=@@WORKING_DIR@@/worker ExecStart=/usr/bin/sh -c '@@VENV_DIR@@/bin/celery worker \ --app=libretime_worker.tasks:worker \ --config=libretime_worker.config \ + --beat \ --time-limit=1800 \ --concurrency=1 \ --loglevel=INFO \ diff --git a/worker/libretime_worker/config.py b/worker/libretime_worker/config.py index 79a143a59..68aef5feb 100644 --- a/worker/libretime_worker/config.py +++ b/worker/libretime_worker/config.py @@ -20,6 +20,7 @@ CELERY_RESULT_PERSISTENT = True # Persist through a broker restart CELERY_TASK_RESULT_EXPIRES = 900 # Expire task results after 15 minutes CELERY_RESULT_EXCHANGE = "celeryresults" # Default exchange - needed due to php-celery CELERY_QUEUES = ( + Queue("celery", exchange=Exchange("celery"), routing_key="celery"), Queue("podcast", exchange=Exchange("podcast"), routing_key="podcast"), Queue(exchange=Exchange("celeryresults"), auto_delete=True), ) diff --git a/worker/libretime_worker/tasks.py b/worker/libretime_worker/tasks.py index 1934c5551..bf8af02cf 100644 --- a/worker/libretime_worker/tasks.py +++ b/worker/libretime_worker/tasks.py @@ -9,7 +9,9 @@ from urllib.parse import urlsplit import mutagen import requests from celery import Celery, signals +from celery.schedules import crontab from celery.utils.log import get_task_logger +from libretime_api_client.v1 import ApiClient as LegacyClient from mutagen import MutagenError from requests import RequestException, Response @@ -19,6 +21,11 @@ from .config import config worker = Celery() logger = get_task_logger(__name__) +legacy_client = LegacyClient( + base_url=config.general.public_url, + api_key=config.general.api_key, +) + @signals.worker_init.connect def init_sentry(**_kwargs): @@ -37,6 +44,22 @@ def init_sentry(**_kwargs): ) +worker.conf.beat_schedule = { + "legacy-trigger-task-manager": { + "task": "libretime_worker.tasks.legacy_trigger_task_manager", + "schedule": crontab(minute="*/5"), + }, +} + + +@worker.task() +def legacy_trigger_task_manager(): + """ + Trigger the legacy task manager to perform background tasks. + """ + legacy_client.trigger_task_manager() + + @worker.task(name="podcast-download", acks_late=True) def podcast_download( episode_id: int,