summaryrefslogtreecommitdiff
path: root/src/resolve/resolved-dns-scope.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-11-05 17:00:20 +0100
committerLennart Poettering <lennart@poettering.net>2021-02-15 21:59:05 +0100
commit5e8bc852d538544a2285ced429e3a805f13ea260 (patch)
tree9a1035166393b2fa79fc4da3fad48ba3a394aba3 /src/resolve/resolved-dns-scope.c
parentc78735eb795f1377d8d08bc57401efe742d9ec19 (diff)
downloadsystemd-5e8bc852d538544a2285ced429e3a805f13ea260.tar.gz
resolved: don't redundantly switch DNS servers because of transaction failures
When a transaction fails and we decide to switch DNS servers, don#t do so unconditionally. Check if the current DNS server is still the same as when the transaction was initiated. And if not, do not do anything. That should reduce the number of redundant DNS server switches if many parallel transactions fail simultaneously (which is pretty likely if DNSSEC is on). Fixes: #17040
Diffstat (limited to 'src/resolve/resolved-dns-scope.c')
-rw-r--r--src/resolve/resolved-dns-scope.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c
index 245f9bfce8..c962af9aba 100644
--- a/src/resolve/resolved-dns-scope.c
+++ b/src/resolve/resolved-dns-scope.c
@@ -153,16 +153,19 @@ unsigned dns_scope_get_n_dns_servers(DnsScope *s) {
return n;
}
-void dns_scope_next_dns_server(DnsScope *s) {
+void dns_scope_next_dns_server(DnsScope *s, DnsServer *if_current) {
assert(s);
if (s->protocol != DNS_PROTOCOL_DNS)
return;
+ /* Changes to the next DNS server in the list. If 'if_current' is passed will do so only if the
+ * current DNS server still matches it. */
+
if (s->link)
- link_next_dns_server(s->link);
+ link_next_dns_server(s->link, if_current);
else
- manager_next_dns_server(s->manager);
+ manager_next_dns_server(s->manager, if_current);
}
void dns_scope_packet_received(DnsScope *s, usec_t rtt) {