]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: time period which determines how long NS non-reachabilty will be cached made...
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Mon, 19 Mar 2018 16:42:31 +0000 (17:42 +0100)
committerPetr Špaček <petr.spacek@nic.cz>
Wed, 28 Mar 2018 09:15:23 +0000 (11:15 +0200)
daemon/bindings.c
daemon/engine.c
lib/nsrep.c
lib/resolve.h

index bdde5dfa54dbddf1398728b29f48c3e15f4c22f9..361b66cc7bc8d43f9f77e1953175528f8db05783 100644 (file)
@@ -1117,6 +1117,39 @@ static int cache_get(lua_State *L)
        return 1;
 }
 
+/** Set time interval for cleaning rtt cache.
+ * Servers with score >= KR_NS_TIMEOUTED will be cleaned after
+ * this interval ended up, so that they will be able to participate
+ * in NS elections again. */
+static int cache_touted_ns_clean_interval(lua_State *L)
+{
+       struct engine *engine = engine_luaget(L);
+       struct kr_context *ctx = &engine->resolver;
+
+       /* Check parameters */
+       int n = lua_gettop(L);
+       if (n < 1) {
+               lua_pushinteger(L, ctx->cache_rtt_tout_retry_interval);
+               return 1;
+       }
+
+       if (!lua_isnumber(L, 1)) {
+               format_error(L, "expected 'cache.ns_tout(interval in ms)'");
+               lua_error(L);
+       }
+
+       lua_Number interval_lua = lua_tonumber(L, 1);
+       if (!(interval_lua >= 0 && interval_lua < UINT_MAX)) {
+               format_error(L, "invalid interval specified, it must be in range > 0, < " xstr(UINT_MAX));
+               lua_error(L);
+       }
+
+       ctx->cache_rtt_tout_retry_interval = interval_lua;
+       lua_pushinteger(L, ctx->cache_rtt_tout_retry_interval);
+       return 1;
+}
+
+
 int lib_cache(lua_State *L)
 {
        static const luaL_Reg lib[] = {
@@ -1131,6 +1164,7 @@ int lib_cache(lua_State *L)
                { "get",    cache_get },
                { "max_ttl", cache_max_ttl },
                { "min_ttl", cache_min_ttl },
+               { "ns_tout", cache_touted_ns_clean_interval },
                { NULL, NULL }
        };
 
index a32b18d6fca0f5ecd29f936217857aa42ac5ad66..e62d71135a4791b2acfdb8a3a15ab9103842d203 100644 (file)
@@ -585,6 +585,7 @@ static int init_resolver(struct engine *engine)
        engine->resolver.negative_anchors = map_make(NULL);
        engine->resolver.pool = engine->pool;
        engine->resolver.modules = &engine->modules;
+       engine->resolver.cache_rtt_tout_retry_interval = KR_NS_TIMEOUT_RETRY_INTERVAL;
        /* Create OPT RR */
        engine->resolver.opt_rr = mm_alloc(engine->pool, sizeof(knot_rrset_t));
        if (!engine->resolver.opt_rr) {
index 9be90e46a2e3df89d19cf33e3fa2c6556f4728dc..f7aae0d98139ad816af30385511bd8b7eccef690 100644 (file)
@@ -82,9 +82,11 @@ static void update_nsrep_set(struct kr_nsrep *ns, const knot_dname_t *name, uint
 
 #undef ADDR_SET
 
-static unsigned eval_addr_set(pack_t *addr_set, kr_nsrep_rtt_lru_t *rtt_cache,
-                             unsigned score, uint8_t *addr[], struct kr_qflags opts)
+static unsigned eval_addr_set(pack_t *addr_set, struct kr_context *ctx,
+                             unsigned score, uint8_t *addr[])
 {
+       kr_nsrep_rtt_lru_t *rtt_cache = ctx->cache_rtt;
+       struct kr_qflags opts = ctx->options;
        /* Name server is better candidate if it has address record. */
        uint8_t *it = pack_head(*addr_set);
        while (it != pack_tail(*addr_set)) {
@@ -110,10 +112,10 @@ static unsigned eval_addr_set(pack_t *addr_set, kr_nsrep_rtt_lru_t *rtt_cache,
                                elapsed = elapsed > UINT_MAX ? UINT_MAX : elapsed;
                                /* If NS once was marked as "timeouted",
                                 * it won't participate in NS elections
-                                * at least KR_NS_TIMEOUT_RETRY_INTERVAL milliseconds. */
+                                * at least ctx->cache_rtt_tout_retry_interval milliseconds. */
                                addr_score = cached->score;
                                if (cached->score >= KR_NS_TIMEOUT &&
-                                   elapsed > KR_NS_TIMEOUT_RETRY_INTERVAL) {
+                                   elapsed > ctx->cache_rtt_tout_retry_interval) {
                                        addr_score = KR_NS_LONG - 1;
                                        cached->score = addr_score;
                                        cached->tout_timestamp = 0;
@@ -171,7 +173,7 @@ static int eval_nsrep(const char *k, void *v, void *baton)
                        }
                }
        } else {
-               score = eval_addr_set(addr_set, ctx->cache_rtt, score, addr_choice, ctx->options);
+               score = eval_addr_set(addr_set, ctx, score, addr_choice);
        }
 
        /* Probabilistic bee foraging strategy (naive).
@@ -286,7 +288,7 @@ int kr_nsrep_elect_addr(struct kr_query *qry, struct kr_context *ctx)
        }
        /* Evaluate addr list */
        uint8_t *addr_choice[KR_NSREP_MAXADDR] = { NULL, };
-       unsigned score = eval_addr_set(addr_set, ctx->cache_rtt, ns->score, addr_choice, ctx->options);
+       unsigned score = eval_addr_set(addr_set, ctx, ns->score, addr_choice);
        update_nsrep_set(ns, ns->name, addr_choice, score);
        return kr_ok();
 }
index 5ff49273093f0c558d552f44b0fb2bc36eab9a3a..011679ec676f1491892b3026d18245c9bacf4dfd 100644 (file)
@@ -163,6 +163,7 @@ struct kr_context
        struct kr_zonecut root_hints;
        struct kr_cache cache;
        kr_nsrep_rtt_lru_t *cache_rtt;
+       unsigned cache_rtt_tout_retry_interval;
        kr_nsrep_lru_t *cache_rep;
        module_array_t *modules;
        /* The cookie context structure should not be held within the cookies