From: Lukáš Ondráček Date: Mon, 4 Nov 2024 16:23:34 +0000 (+0100) Subject: daemon/defer: enable defer by default X-Git-Tag: v6.0.10~6^2~39 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b9be2f80cdde984071f144c8e13d3f1cc2e900a;p=thirdparty%2Fknot-resolver.git daemon/defer: enable defer by default --- diff --git a/daemon/defer.c b/daemon/defer.c index 32b0358c0..20f8fb557 100644 --- a/daemon/defer.c +++ b/daemon/defer.c @@ -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; diff --git a/daemon/defer.h b/daemon/defer.h index db1b083b3..cd899fa18 100644 --- a/daemon/defer.h +++ b/daemon/defer.h @@ -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 diff --git a/daemon/main.c b/daemon/main.c index e89e2b017..646a003d0 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -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; diff --git a/doc/_static/config.schema.json b/doc/_static/config.schema.json index c6934109a..b9397dc92 100644 --- a/doc/_static/config.schema.json +++ b/doc/_static/config.schema.json @@ -1707,6 +1707,20 @@ }, "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", diff --git a/python/knot_resolver/datamodel/config_schema.py b/python/knot_resolver/datamodel/config_schema.py index 641032dc3..6329add37 100644 --- a/python/knot_resolver/datamodel/config_schema.py +++ b/python/knot_resolver/datamodel/config_schema.py @@ -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 index 000000000..40de04013 --- /dev/null +++ b/python/knot_resolver/datamodel/defer_schema.py @@ -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 index 000000000..8cad0cfc1 --- /dev/null +++ b/python/knot_resolver/datamodel/templates/defer.lua.j2 @@ -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 %} diff --git a/python/knot_resolver/datamodel/templates/policy-config.lua.j2 b/python/knot_resolver/datamodel/templates/policy-config.lua.j2 index 4c5c90484..89eeb94c3 100644 --- a/python/knot_resolver/datamodel/templates/policy-config.lua.j2 +++ b/python/knot_resolver/datamodel/templates/policy-config.lua.j2 @@ -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() diff --git a/python/knot_resolver/datamodel/templates/worker-config.lua.j2 b/python/knot_resolver/datamodel/templates/worker-config.lua.j2 index c97f0820b..be7fe1508 100644 --- a/python/knot_resolver/datamodel/templates/worker-config.lua.j2 +++ b/python/knot_resolver/datamodel/templates/worker-config.lua.j2 @@ -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 -------------------------------------- diff --git a/python/knot_resolver/manager/manager.py b/python/knot_resolver/manager/manager.py index f9c687087..6ce32fcc2 100644 --- a/python/knot_resolver/manager/manager.py +++ b/python/knot_resolver/manager/manager.py @@ -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