]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/nsrep: do not penalize name failures, no empty NSLIST leaders
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 24 Nov 2015 19:00:11 +0000 (20:00 +0100)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 24 Nov 2015 19:00:11 +0000 (20:00 +0100)
if the NSLIST already has a candidate with addresses, never replace
current leader with an empty one. otherwise if the former leader address
was tried and failed, new empty leader would be blamed for this and
penalized

lib/nsrep.c
lib/resolve.c
tests/deckard

index c0d6fa064a4ffd259d362aeaf1f79615e5fb0ed3..2dfd05d2cf2d80a37730badb5ece81a304c6c44f 100644 (file)
@@ -58,6 +58,11 @@ static void update_nsrep(struct kr_nsrep *ns, size_t pos, uint8_t *addr, size_t
 
 static void update_nsrep_set(struct kr_nsrep *ns, const knot_dname_t *name, uint8_t *addr[], unsigned score)
 {
+       /* NSLIST is not empty, empty NS cannot be a leader. */
+       if (!addr[0] && ns->addr[0].ip.sa_family != AF_UNSPEC) {
+               return;
+       }
+       /* Set new NS leader */
        ns->name = name;
        ns->score = score;
        for (size_t i = 0; i < KR_NSREP_MAXADDR; ++i) {
@@ -133,7 +138,7 @@ static int eval_nsrep(const char *k, void *v, void *baton)
                        score += FAVOUR_IPV6;
                        /* If the server is unknown but has rep record, treat it as timeouted */
                        if (reputation & KR_NS_NOIP4) {
-                               score = KR_NS_TIMEOUT;
+                               score = KR_NS_UNKNOWN;
                                reputation = 0; /* Start with clean slate */
                        }
                }
index 8fc1e9a37ca7aeede87995f5b6ddafef20b6ed0a..55cbccca744b3751abedd3c987a60b049b64fd05 100644 (file)
@@ -424,18 +424,19 @@ int kr_resolve_consume(struct kr_request *request, const struct sockaddr *src, k
                ITERATE_LAYERS(request, qry, consume, packet);
        }
 
-       /* Resolution failed, invalidate current NS. */
-       if (request->state == KNOT_STATE_FAIL) {
-               kr_nsrep_update_rtt(&qry->ns, src, KR_NS_TIMEOUT, ctx->cache_rtt);
-               invalidate_ns(rplan, qry);
-               qry->flags &= ~QUERY_RESOLVED;
        /* Track RTT for iterative answers */
-       } else if (!(qry->flags & QUERY_CACHED)) {
+       if (!(qry->flags & QUERY_CACHED)) {
                struct timeval now;
                gettimeofday(&now, NULL);
                kr_nsrep_update_rtt(&qry->ns, src, time_diff(&qry->timestamp, &now), ctx->cache_rtt);
                /* Sucessful answer, lift any address resolution requests. */
-               qry->flags &= ~(QUERY_AWAIT_IPV6|QUERY_AWAIT_IPV4);
+               if (request->state != KNOT_STATE_FAIL)
+                       qry->flags &= ~(QUERY_AWAIT_IPV6|QUERY_AWAIT_IPV4);
+       }
+       /* Resolution failed, invalidate current NS. */
+       if (request->state == KNOT_STATE_FAIL) {
+               invalidate_ns(rplan, qry);
+               qry->flags &= ~QUERY_RESOLVED;
        }
 
        /* Pop query if resolved. */
index 421a66cf3f1c957844b07e084af184c55a4210d2..9650d08110c15a6ed80f072c877f160b12c1f351 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 421a66cf3f1c957844b07e084af184c55a4210d2
+Subproject commit 9650d08110c15a6ed80f072c877f160b12c1f351