From 471499ad2c7666da0575b618a1165a0ee8c1409c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Vavru=C5=A1a?= Date: Thu, 24 May 2018 16:08:07 -0700 Subject: [PATCH] nsrep: verbose probe message, cap timeout value, less aggressive retry 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 | 2 +- lib/nsrep.c | 13 +++++++------ lib/resolve.c | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/daemon/worker.c b/daemon/worker.c index ff963cdff..839332570 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -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; } diff --git a/lib/nsrep.c b/lib/nsrep.c index 3558cf715..638a65da6 100644 --- a/lib/nsrep.c +++ b/lib/nsrep.c @@ -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(); } diff --git a/lib/resolve.c b/lib/resolve.c index 00560d2c3..fbcd64dfc 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -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) { -- 2.47.2