]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: systemd backend: watchdog for cache gc
authorAleš <ales.mrazek@nic.cz>
Tue, 22 Feb 2022 16:04:51 +0000 (17:04 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Fri, 8 Apr 2022 14:17:54 +0000 (16:17 +0200)
- KresIDs are also equal when custom str representations are equal
- systemd services naming

manager/knot_resolver_manager/kres_id.py
manager/knot_resolver_manager/kres_manager.py
manager/knot_resolver_manager/kresd_controller/systemd/__init__.py
manager/knot_resolver_manager/kresd_controller/systemd/dbus_api.py

index 8a183d19f11bec108198d39d906dc6f89ef07c86..76cccd8b7305cfec4f29b79295597f49c289a4f4 100644 (file)
@@ -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
index e2d6f54fe3534a562e23fffb16afed14dedb2108..444bebcfb497c4c80326319f3df028542fcc5952 100644 (file)
@@ -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
index 9951099391ecd35d763223c0506133839dba7cff..60424bb0fa8206659eca171a5eddf89af1935b1e 100644 (file)
@@ -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]:
index 67479778f76338bb15778885d167b4553a348761..3d34d4d2cd3d774415ad7572bb806b85fc351ae5 100644 (file)
@@ -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