From: Vladimír Čunát Date: Fri, 30 Nov 2018 09:37:40 +0000 (+0100) Subject: fixup! daemon: forwarding - attempt to handle timeouted upstream X-Git-Tag: v3.2.0~15^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=237192f2fc2979024659b4e90b72e64987823b31;p=thirdparty%2Fknot-resolver.git fixup! daemon: forwarding - attempt to handle timeouted upstream Reduce copy&paste. --- diff --git a/lib/resolve.c b/lib/resolve.c index 6361d705c..400993677 100644 --- a/lib/resolve.c +++ b/lib/resolve.c @@ -1423,24 +1423,12 @@ ns_election: const struct kr_qflags qflg = qry->flags; const bool retry = qflg.TCP || qflg.BADCOOKIE_AGAIN; + bool check_timeouted = false; if (qflg.AWAIT_IPV4 || qflg.AWAIT_IPV6) { kr_nsrep_elect_addr(qry, request->ctx); } else if (qflg.FORWARD || qflg.STUB) { kr_nsrep_sort(&qry->ns, request->ctx->cache_rtt); - if (qry->ns.score > KR_NS_TIMEOUT) { - if (kr_zonecut_is_empty(&qry->zone_cut)) { - VERBOSE_MSG(qry, "=> no NS with an address\n"); - } else { - VERBOSE_MSG(qry, "=> no valid NS left\n"); - } - if (!qry->flags.NO_NS_FOUND) { - qry->flags.NO_NS_FOUND = true; - } else { - ITERATE_LAYERS(request, qry, reset); - kr_rplan_pop(rplan, qry); - } - return KR_STATE_PRODUCE; - } + check_timeouted = true; } else if (!qry->ns.name || !retry) { /* Keep NS when requerying/stub/badcookie. */ /* Root DNSKEY must be fetched from the hints to avoid chicken and egg problem. */ if (qry->sname[0] == '\0' && qry->stype == KNOT_RRTYPE_DNSKEY) { @@ -1448,20 +1436,22 @@ ns_election: qry->flags.NO_THROTTLE = true; /* Pick even bad SBELT servers */ } kr_nsrep_elect(qry, request->ctx); - if (qry->ns.score > KR_NS_MAX_SCORE) { - if (kr_zonecut_is_empty(&qry->zone_cut)) { - VERBOSE_MSG(qry, "=> no NS with an address\n"); - } else { - VERBOSE_MSG(qry, "=> no valid NS left\n"); - } - if (!qry->flags.NO_NS_FOUND) { - qry->flags.NO_NS_FOUND = true; - } else { - ITERATE_LAYERS(request, qry, reset); - kr_rplan_pop(rplan, qry); - } - return KR_STATE_PRODUCE; + check_timeouted = true; + } + + if (check_timeouted && qry->ns.score > KR_NS_TIMEOUT) { + if (kr_zonecut_is_empty(&qry->zone_cut)) { + VERBOSE_MSG(qry, "=> no NS with an address\n"); + } else { + VERBOSE_MSG(qry, "=> no valid NS left\n"); } + if (!qry->flags.NO_NS_FOUND) { + qry->flags.NO_NS_FOUND = true; + } else { + ITERATE_LAYERS(request, qry, reset); + kr_rplan_pop(rplan, qry); + } + return KR_STATE_PRODUCE; } /* Resolve address records */