]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
selection: don't include servers over error limit in selection
authorŠtěpán Balážik <stepan.balazik@nic.cz>
Fri, 4 Sep 2020 14:50:26 +0000 (16:50 +0200)
committerŠtěpán Balážik <stepan.balazik@nic.cz>
Thu, 15 Oct 2020 11:22:22 +0000 (13:22 +0200)
lib/selection.c
lib/selection.h
lib/selection_forward.c
lib/selection_iter.c

index c22de5ad620599910be00e5236ea79639426e11d..4d94c4b2f8e1f682b8cabed9224001c255a5bb52 100644 (file)
@@ -178,8 +178,6 @@ void shuffle_choices(struct choice choices[], int choices_len) {
        }
 }
 
-#define ERROR_LIMIT 2
-
 // Performs the actual selection (currently epsilon-greedy with epsilon = 0.05).
 struct kr_transport *choose_transport(struct choice choices[],
                                                                                         int choices_len,
@@ -211,11 +209,7 @@ struct kr_transport *choose_transport(struct choice choices[],
                // EXPLOIT
                shuffle_choices(choices, choices_len);
                qsort(choices, choices_len, sizeof(struct choice), cmp_choices);
-               if (choices[0].address_state->error_count > ERROR_LIMIT) {
-                       return NULL;
-               } else {
-                       choice = 0;
-               }
+               choice = 0;
        }
 
        unsigned timeout = calc_timeout(choices[choice].address_state->rtt_state);
index 24e6deda896b2898d931a0cd3f3620e397ee2d77..f46f0d7a6009001900500e24731360d7159d3ca7 100644 (file)
@@ -11,6 +11,8 @@
 
 #include "lib/cache/api.h"
 
+#define ERROR_LIMIT_PER_SERVER 2
+
 /**
  * These errors are to be reported as feedback to server selection.
  * See `kr_server_selection::error` for more details.
index 27bb1a490739c36a3dd70e96edef3dc2d88ce9cc..8ca1fcece569aef7d3238efbf2e6975e036fe281 100644 (file)
@@ -55,7 +55,7 @@ void forward_choose_transport(struct kr_query *qry, struct kr_transport **transp
                check_tcp_connections(addr_state, qry->request, &address->ip);
                check_network_settings(addr_state, addr_len, qry->flags.NO_IPV4, qry->flags.NO_IPV6);
 
-               if(addr_state->generation == -1) {
+               if(addr_state->generation == -1 || addr_state->error_count >= ERROR_LIMIT_PER_SERVER) {
                        continue;
                }
                addr_state->forward_index = i;
index 59e17f5c8800dd9a4b7de45f5199ddf0ed3bb8ee..6fee28c8f292e844579ef4cebc7b9e083ef2fc0e 100644 (file)
@@ -163,7 +163,8 @@ void iter_choose_transport(struct kr_query *qry, struct kr_transport **transport
                size_t address_len;
                uint8_t* address = (uint8_t *)trie_it_key(it, &address_len);
                struct address_state *address_state = (struct address_state *)*trie_it_val(it);
-               if (address_state->generation == local_state->generation) {
+               if (address_state->generation == local_state->generation &&
+                   address_state->error_count < ERROR_LIMIT_PER_SERVER) {
                        choices[valid_addresses] = (struct choice){
                                .address = address,
                                .address_len = address_len,