]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: forwarding - attempt to handle timeouted upstream
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Thu, 29 Nov 2018 16:58:25 +0000 (17:58 +0100)
committerGrigorii Demidov <grigorii.demidov@nic.cz>
Fri, 7 Dec 2018 10:23:42 +0000 (11:23 +0100)
daemon/worker.c
lib/nsrep.c
lib/resolve.c

index 1b5b5b3d56cdd1eeae82bf2d5ba2d5dc77731d3b..5c153811e2bc00eed8bb619c4758a923e91299c0 100644 (file)
@@ -1331,9 +1331,9 @@ static int tcp_task_step(struct qr_task *task,
        }
 
        if (ret != kr_ok()) {
-               subreq_finalize(task, packet_source, packet);
+               subreq_finalize(task, addr, packet);
                if (ret == kr_error(EAGAIN)) {
-                       ret = qr_task_step(task, NULL, NULL);
+                       ret = qr_task_step(task, addr, NULL);
                } else {
                        ret = qr_task_finalize(task, KR_STATE_FAIL);
                }
index 69d9634749d1ae87bba76f2e31a603ea783be67e..57747dd3222f6f9e6a05e1c35b06f69a04b04a4d 100644 (file)
@@ -485,11 +485,6 @@ int kr_nsrep_sort(struct kr_nsrep *ns, kr_nsrep_rtt_lru_t *rtt_cache)
                return kr_error(EINVAL);
        }
 
-       if (ns->addr[1].ip.sa_family == AF_UNSPEC) {
-               /* We have only one entry here, do nothing */
-               return kr_ok();
-       }
-
        /* Compute the scores.  Unfortunately there's no space for scores
         * along the addresses. */
        unsigned scores[KR_NSREP_MAXADDR];
index 800f8f4ae04c1d8f1539a57969e461839d86381a..6361d705cd912638d219f8c3bd0f67731a7108e9 100644 (file)
@@ -882,9 +882,7 @@ static void update_nslist_score(struct kr_request *request, struct kr_query *qry
        } else if (!(qry->flags.DNSSEC_BOGUS)) {
                kr_nsrep_update_rtt(&qry->ns, src, KR_NS_TIMEOUT, ctx->cache_rtt, KR_NS_UPDATE);
                WITH_VERBOSE(qry) {
-                       char addr_str[INET6_ADDRSTRLEN];
-                       inet_ntop(src->sa_family, kr_inaddr(src), addr_str, sizeof(addr_str));
-                       VERBOSE_MSG(qry, "=> server: '%s' flagged as 'bad'\n", addr_str);
+                       VERBOSE_MSG(qry, "=> server: '%s' flagged as 'bad'\n", kr_straddr(src));
                }
        }
 }
@@ -1429,6 +1427,20 @@ ns_election:
                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;
+               }
        } 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) {