]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/defer: enable defer by default docs-develop-defe-x6j6qe/deployments/5516
authorLukáš Ondráček <lukas.ondracek@nic.cz>
Mon, 4 Nov 2024 16:23:34 +0000 (17:23 +0100)
committerLukáš Ondráček <lukas.ondracek@nic.cz>
Wed, 6 Nov 2024 15:54:22 +0000 (16:54 +0100)
daemon/defer.c
daemon/defer.h
daemon/main.c
doc/_static/config.schema.json
python/knot_resolver/datamodel/config_schema.py
python/knot_resolver/datamodel/defer_schema.py [new file with mode: 0644]
python/knot_resolver/datamodel/templates/defer.lua.j2 [new file with mode: 0644]
python/knot_resolver/datamodel/templates/policy-config.lua.j2
python/knot_resolver/datamodel/templates/worker-config.lua.j2
python/knot_resolver/manager/manager.py

index 32b0358c02b0df09f66fa771b18445df60a11f4d..20f8fb557b2e2207cd97c36a0b29e36c8628950c 100644 (file)
@@ -69,6 +69,7 @@ struct defer {
        _Alignas(64) uint8_t kru[];
 };
 struct defer *defer = NULL;
+bool defer_initialized = false;
 struct mmapped defer_mmapped = {0};
 
 defer_sample_state_t defer_sample_state = {
@@ -440,6 +441,12 @@ static void defer_queues_idle(uv_idle_t *handle)
 /// Initialize shared memory, queues. To be called from Lua.
 int defer_init(const char *mmap_file, int cpus)
 {
+       defer_initialized = true;
+       if (mmap_file == NULL) {
+               // defer explicitly disabled
+               return 0;
+       }
+
        int ret = 0;
        if (cpus < 1) {
                ret = EINVAL;
index db1b083b3700740def5276cbcf31718d9447e0b2..cd899fa185e01abb2a19ebb9209099a9fd022278 100644 (file)
@@ -8,7 +8,6 @@
 #include "lib/kru.h"
 
 /// Initialize defer, incl. shared memory with KRU, excl. idle.
-/// To be called from Lua; defer is disabled by default otherwise.
 KR_EXPORT
 int defer_init(const char *mmap_file, int cpus);
 
@@ -30,6 +29,7 @@ typedef struct {
 extern defer_sample_state_t defer_sample_state;
 
 extern struct defer *defer;  /// skip sampling/deferring if NULL
+extern bool defer_initialized; /// defer_init was called, possibly keeping defer disabled
 
 
 // TODO: reconsider `static inline` cases below
index e89e2b017b24baeb835822df5f00fbae263df42b..646a003d0357ee1ff83f87a6460f36f84b8442a0 100644 (file)
@@ -571,6 +571,15 @@ int main(int argc, char **argv)
                lua_settop(the_engine->L, 0);
        }
 
+       if (!defer_initialized) {
+               kr_log_warning(SYSTEM, "Prioritization not initialized from Lua, using hardcoded default.");
+               ret = defer_init("defer", 1);
+               if (ret) {
+                       ret = EXIT_FAILURE;
+                       goto cleanup;
+               }
+       }
+
        if (defer_init_idle(loop) != 0) {
                ret = EXIT_FAILURE;
                goto cleanup;
index c6934109a3a83b2d353c6ee751192ac7dd4d959e..b9397dc925d2d709b25cb1b2e854825467f05eda 100644 (file)
             },
             "default": null
         },
+        "defer": {
+            "description": "Configuration of request prioritization (defer).",
+            "type": "object",
+            "properties": {
+                "enabled": {
+                    "type": "boolean",
+                    "description": "Use request prioritization.",
+                    "default": true
+                }
+            },
+            "default": {
+                "enabled": true
+            }
+        },
         "lua": {
             "description": "Custom Lua configuration.",
             "type": "object",
index 641032dc3f0d9005d56466a204f9ab6471aa4b84..6329add3767956a485b45cf86fd10ce180762ce9 100644 (file)
@@ -17,6 +17,7 @@ from knot_resolver.datamodel.monitoring_schema import MonitoringSchema
 from knot_resolver.datamodel.network_schema import NetworkSchema
 from knot_resolver.datamodel.options_schema import OptionsSchema
 from knot_resolver.datamodel.rate_limiting_schema import RateLimitingSchema
+from knot_resolver.datamodel.defer_schema import DeferSchema
 from knot_resolver.datamodel.templates import POLICY_CONFIG_TEMPLATE, WORKER_CONFIG_TEMPLATE
 from knot_resolver.datamodel.types import EscapedStr, IntPositive, WritableDir
 from knot_resolver.datamodel.view_schema import ViewSchema
@@ -108,6 +109,7 @@ class KresConfig(ConfigSchema):
         monitoring: Metrics exposisition configuration (Prometheus, Graphite)
         lua: Custom Lua configuration.
         rate_limiting: Configuration of rate limiting.
+        defer: Configuration of request prioritization (defer).
         """
 
         version: int = 1
@@ -129,6 +131,7 @@ class KresConfig(ConfigSchema):
         logging: LoggingSchema = LoggingSchema()
         monitoring: MonitoringSchema = MonitoringSchema()
         rate_limiting: Optional[RateLimitingSchema] = None
+        defer: DeferSchema = DeferSchema()
         lua: LuaSchema = LuaSchema()
 
     _LAYER = Raw
@@ -151,6 +154,7 @@ class KresConfig(ConfigSchema):
     logging: LoggingSchema
     monitoring: MonitoringSchema
     rate_limiting: Optional[RateLimitingSchema]
+    defer: DeferSchema
     lua: LuaSchema
 
     def _hostname(self, obj: Raw) -> Any:
diff --git a/python/knot_resolver/datamodel/defer_schema.py b/python/knot_resolver/datamodel/defer_schema.py
new file mode 100644 (file)
index 0000000..40de040
--- /dev/null
@@ -0,0 +1,12 @@
+from knot_resolver.utils.modeling import ConfigSchema
+
+
+class DeferSchema(ConfigSchema):
+    """
+    Configuration of request prioritization (defer).
+
+    ---
+    enabled: Use request prioritization.
+    """
+
+    enabled: bool = True
diff --git a/python/knot_resolver/datamodel/templates/defer.lua.j2 b/python/knot_resolver/datamodel/templates/defer.lua.j2
new file mode 100644 (file)
index 0000000..8cad0cf
--- /dev/null
@@ -0,0 +1,9 @@
+{% from 'macros/common_macros.lua.j2' import boolean %}
+
+{% if cfg.defer.enabled and not disable_defer -%}
+assert(C.defer_init(
+       '{{ cfg.rundir }}/defer',
+       {{ cfg.workers }}) == 0)
+{% else %}
+assert(C.defer_init(nil, 0) == 0)
+{%- endif %}
index 4c5c9048493ee0e930a4f4149fa7c262a8db5798..89eeb94c3ff31580bc50b6f6ef69f3fd1345b2ef 100644 (file)
@@ -35,6 +35,11 @@ cache.open({{ cfg.cache.size_max.bytes() }}, 'lmdb://{{ cfg.cache.storage }}')
 -- FORWARD section ----------------------------------
 {% include "forward.lua.j2" %}
 
+-- DEFER section ------------------------------------
+{% set disable_defer = true %}
+{% include "defer.lua.j2" %}
+
+
 {% endif %}
 
 quit()
index c97f0820bc84dde13763a023a1b1b39f2183a7f5..be7fe150872823dcce7a5fac8612384dc7e15a9e 100644 (file)
@@ -46,6 +46,9 @@ nsid.name('{{ cfg.nsid }}' .. worker.id)
 -- RATE-LIMITING section ------------------------------------
 {% include "rate_limiting.lua.j2" %}
 
+-- DEFER section ------------------------------------
+{% include "defer.lua.j2" %}
+
 {% endif %}
 
 -- LUA section --------------------------------------
index f9c68708769d91884e3c07855b13f227a58e563f..6ce32fcc24d7ac580a3e55b586e6ef5b70e5d454 100644 (file)
@@ -214,11 +214,17 @@ class KresManager:  # pylint: disable=too-many-instance-attributes
     async def validate_config(self, _old: KresConfig, new: KresConfig) -> Result[NoneType, str]:
         async with self._manager_lock:
             if _old.rate_limiting != new.rate_limiting:
-                logger.debug("Unlinking shared RRL memory")
+                logger.debug("Unlinking shared ratelimiting memory")
                 try:
                     os.unlink(str(_old.rundir) + "/ratelimiting")
                 except FileNotFoundError:
                     pass
+            if _old.workers != new.workers or _old.defer != new.defer:
+                logger.debug("Unlinking shared defer memory")
+                try:
+                    os.unlink(str(_old.rundir) + "/defer")
+                except FileNotFoundError:
+                    pass
             logger.debug("Testing the new config with a canary process")
             try:
                 # technically, this has side effects of leaving a new process runnning