]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
nsrep: verbose probe message, cap timeout value, less aggressive retry
authorMarek Vavruša <mvavrusa@cloudflare.com>
Thu, 24 May 2018 23:08:07 +0000 (16:08 -0700)
committerMarek Vavruša <mvavrusa@cloudflare.com>
Fri, 7 Sep 2018 17:45:21 +0000 (10:45 -0700)
The timeouted NS retry probed is now logged when tracing
Long response RTT is capped to KR_NS_TIMEOUT to smooth out transient errors.
The retry timer minimum interval is increased from 250ms to 500ms, as NSs taking
typically longer than 1s would just waste time retrying.

daemon/worker.c
lib/nsrep.c
lib/resolve.c

index ff963cdff268bbf48f0c73bb49bce8f2daa50751..839332570d9e607188f526610ac0f5a7db406309 100644 (file)
@@ -1640,7 +1640,7 @@ static int qr_task_step(struct qr_task *task,
                size_t timeout = qry->ns.score;
                if (timeout > KR_NS_GLUED) {
                        /* We don't have information about variance in RTT, expect +10ms */
-                       timeout = MIN(qry->ns.score + 10, KR_CONN_RETRY);
+                       timeout = MIN(qry->ns.score + 10, 2*KR_CONN_RETRY);
                } else {
                        timeout = KR_CONN_RETRY;
                }
index 3558cf715b741f96fa9969491b56bfd4e8d6d0e4..638a65da66710ad8105debcbe417e01e60ecfb1b 100644 (file)
@@ -83,8 +83,9 @@ static void update_nsrep_set(struct kr_nsrep *ns, const knot_dname_t *name, uint
 #undef ADDR_SET
 
 static unsigned eval_addr_set(const pack_t *addr_set, struct kr_context *ctx,
-                             struct kr_qflags opts, unsigned score, uint8_t *addr[])
+                             struct kr_query *qry, unsigned score, uint8_t *addr[])
 {
+       struct kr_qflags *opts = &qry->flags;
        kr_nsrep_rtt_lru_t *rtt_cache = ctx->cache_rtt;
        kr_nsrep_rtt_lru_entry_t *rtt_cache_entry_ptr[KR_NSREP_MAXADDR] = { NULL, };
        assert (KR_NSREP_MAXADDR >= 2);
@@ -100,10 +101,10 @@ static unsigned eval_addr_set(const pack_t *addr_set, struct kr_context *ctx,
                bool is_valid = false;
                /* Check if the address isn't disabled. */
                if (len == sizeof(struct in6_addr)) {
-                       is_valid = !(opts.NO_IPV6);
+                       is_valid = !(opts->NO_IPV6);
                        favour = FAVOUR_IPV6;
                } else if (len == sizeof(struct in_addr)) {
-                       is_valid = !(opts.NO_IPV4);
+                       is_valid = !(opts->NO_IPV4);
                } else {
                        assert(!EINVAL);
                        is_valid = false;
@@ -187,7 +188,7 @@ get_next_iterator :
                /* rtt_cache_entry_ptr[i] points to "timeouted" rtt cache entry.
                 * The period of the ban on participation in elections has expired. */
 
-               if (VERBOSE_STATUS) {
+               WITH_VERBOSE(qry) {
                        void *val = pack_obj_val(addr[i]);
                        size_t len = pack_obj_len(addr[i]);
                        char sa_str[INET6_ADDRSTRLEN];
@@ -240,7 +241,7 @@ static int eval_nsrep(const knot_dname_t *owner, const pack_t *addr_set, struct
                        }
                }
        } else {
-               score = eval_addr_set(addr_set, ctx, qry->flags, score, addr_choice);
+               score = eval_addr_set(addr_set, ctx, qry, score, addr_choice);
        }
 
        /* Probabilistic bee foraging strategy (naive).
@@ -366,7 +367,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, qry->flags, ns->score, addr_choice);
+       unsigned score = eval_addr_set(addr_set, ctx, qry, ns->score, addr_choice);
        update_nsrep_set(ns, ns->name, addr_choice, score);
        return kr_ok();
 }
index 00560d2c3da7976607c21f284422c32699b261ab..fbcd64dfc8f7066e03557a1f5b78e5b027065ca7 100644 (file)
@@ -884,7 +884,7 @@ static void update_nslist_score(struct kr_request *request, struct kr_query *qry
                unsigned rtt = kr_now() - qry->timestamp_mono;
                unsigned score = is_timeout ? KR_NS_TIMEOUT : (KR_NS_LONG - 1);
                if (score < rtt) {
-                       score = rtt;
+                       score = MIN(rtt, KR_NS_TIMEOUT);
                }
                kr_nsrep_update_rtt(&qry->ns, src, score, ctx->cache_rtt, KR_NS_UPDATE);
                WITH_VERBOSE(qry) {