diff --git a/include/ircd/net/dns_resolver.h b/include/ircd/net/dns_resolver.h index ae3ac8cfa..284fd66dc 100644 --- a/include/ircd/net/dns_resolver.h +++ b/include/ircd/net/dns_resolver.h @@ -37,6 +37,7 @@ ircd::net::dns::resolver static conf::item send_rate; static conf::item send_burst; static conf::item retry_max; + static conf::item retry_serv_fail; answers_callback callback; std::vector server; // The list of active servers diff --git a/ircd/net_dns_resolver.cc b/ircd/net_dns_resolver.cc index f64ff673d..100310938 100644 --- a/ircd/net_dns_resolver.cc +++ b/ircd/net_dns_resolver.cc @@ -39,6 +39,13 @@ ircd::net::dns::resolver::retry_max { "default", 20L }, }; +decltype(ircd::net::dns::resolver::retry_serv_fail) +ircd::net::dns::resolver::retry_serv_fail +{ + { "name", "ircd.net.dns.resolver.retry_serv_fail" }, + { "default", true }, +}; + decltype(ircd::net::dns::resolver::servers) ircd::net::dns::resolver::servers { @@ -726,7 +733,14 @@ ircd::net::dns::resolver::handle_reply(const ipport &from, // Handle ServFail as a special case here. We can try again without // handling this tag or propagating this error any further yet. - if(header.rcode == 2 && tag.tries < size_t(server.size())) + const bool serv_fail_retry + { + retry_serv_fail + && header.rcode == 2 + && tag.tries < size_t(server.size()) + }; + + if(serv_fail_retry) { log::error {