From: Aleš Date: Tue, 22 Feb 2022 16:04:51 +0000 (+0100) Subject: manager: systemd backend: watchdog for cache gc X-Git-Tag: v6.0.0a1~41^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a37fc28987fe3cf7ea95e415e02735207b5b14e3;p=thirdparty%2Fknot-resolver.git manager: systemd backend: watchdog for cache gc - KresIDs are also equal when custom str representations are equal - systemd services naming --- diff --git a/manager/knot_resolver_manager/kres_id.py b/manager/knot_resolver_manager/kres_id.py index 8a183d19f..76cccd8b7 100644 --- a/manager/knot_resolver_manager/kres_id.py +++ b/manager/knot_resolver_manager/kres_id.py @@ -58,7 +58,14 @@ class KresID: return f"KresID({self})" def __hash__(self) -> int: + if self._repr: + return hash(self._repr) return self._id def __eq__(self, o: object) -> bool: - return isinstance(o, KresID) and self._id == o._id + if isinstance(o, KresID): + ret = self._id == o._id + if self._repr: + ret |= self._repr == o._repr + return ret + return False diff --git a/manager/knot_resolver_manager/kres_manager.py b/manager/knot_resolver_manager/kres_manager.py index e2d6f54fe..444bebcfb 100644 --- a/manager/knot_resolver_manager/kres_manager.py +++ b/manager/knot_resolver_manager/kres_manager.py @@ -178,22 +178,24 @@ class KresManager: try: # gather current state detected_subprocesses = await self._controller.get_subprocess_status() - worker_ids = [x.id for x in self._workers] + expected_ids = [x.id for x in self._workers] + if self._gc: + expected_ids.append(self._gc.id) invoke_callback = False - for w in worker_ids: - if w not in detected_subprocesses: - logger.error("Expected to find subprocess with id '%s' in the system, but did not.", w) + for eid in expected_ids: + if eid not in detected_subprocesses: + logger.error("Expected to find subprocess with id '%s' in the system, but did not.", eid) invoke_callback = True continue - if detected_subprocesses[w] is SubprocessStatus.FAILED: - logger.error("Subprocess '%s' is failed.", w) + if detected_subprocesses[eid] is SubprocessStatus.FAILED: + logger.error("Subprocess '%s' is failed.", eid) invoke_callback = True continue - if detected_subprocesses[w] is SubprocessStatus.UNKNOWN: - logger.warning("Subprocess '%s' is in unknown state!", w) + if detected_subprocesses[eid] is SubprocessStatus.UNKNOWN: + logger.warning("Subprocess '%s' is in unknown state!", eid) except asyncio.CancelledError: raise diff --git a/manager/knot_resolver_manager/kresd_controller/systemd/__init__.py b/manager/knot_resolver_manager/kresd_controller/systemd/__init__.py index 995109939..60424bb0f 100644 --- a/manager/knot_resolver_manager/kresd_controller/systemd/__init__.py +++ b/manager/knot_resolver_manager/kresd_controller/systemd/__init__.py @@ -123,7 +123,7 @@ class SystemdSubprocessController(SubprocessController): async def create_subprocess(self, subprocess_config: KresConfig, subprocess_type: SubprocessType) -> Subprocess: assert self._controller_config is not None - custom_id = KresID.from_string("gc") if subprocess_type == SubprocessType.GC else None + custom_id = KresID.from_string(GC_SERVICE_NAME) if subprocess_type == SubprocessType.GC else None return SystemdSubprocess(subprocess_config, subprocess_type, self._systemd_type, custom_id=custom_id) async def get_subprocess_status(self) -> Dict[KresID, SubprocessStatus]: diff --git a/manager/knot_resolver_manager/kresd_controller/systemd/dbus_api.py b/manager/knot_resolver_manager/kresd_controller/systemd/dbus_api.py index 67479778f..3d34d4d2c 100644 --- a/manager/knot_resolver_manager/kresd_controller/systemd/dbus_api.py +++ b/manager/knot_resolver_manager/kresd_controller/systemd/dbus_api.py @@ -3,6 +3,7 @@ import logging import os +import re from enum import Enum, auto from threading import Thread from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar @@ -21,21 +22,28 @@ from knot_resolver_manager.kresd_controller.interface import SubprocessType logger = logging.getLogger(__name__) -GC_SERVICE_NAME = "kresd_gc.service" +_PREFIX = "mkres" +GC_SERVICE_NAME = f"{_PREFIX}_cache_gc.service" +KRESD_SERVICE_PATTERN = re.compile(rf"^{_PREFIX}d_([0-9]+).service$") def kres_id_from_service_name(service_name: str) -> KresID: - v = service_name.replace("kresd_", "").replace(".service", "") - return KresID.from_string(v) + kid = KRESD_SERVICE_PATTERN.search(service_name) + if kid: + return KresID.from_string(kid.groups()[0]) + return KresID.from_string(service_name) def service_name_from_kres_id(kid: KresID) -> str: - return f"kresd_{kid}.service" + rep = str(kid) + if rep.isnumeric(): + return f"{_PREFIX}d_{rep}.service" + return rep def is_service_name_ours(service_name: str) -> bool: is_ours = service_name == GC_SERVICE_NAME - is_ours |= service_name.startswith("kresd_") and service_name.endswith(".service") + is_ours |= bool(KRESD_SERVICE_PATTERN.match(service_name)) return is_ours