From cfffa01f73a598d88e06de58553dddcb2bf1e901 Mon Sep 17 00:00:00 2001 From: Nick <32660358+dontcrash@users.noreply.github.com> Date: Fri, 25 Jul 2025 20:09:16 +0930 Subject: [PATCH] Add random option --- client/src/__locales/en.json | 2 ++ client/src/helpers/constants.ts | 1 + internal/dnsforward/http.go | 6 ++++++ internal/dnsforward/http_internal_test.go | 8 ++++++++ internal/dnsforward/upstreams.go | 2 ++ openapi/next.yaml | 3 +++ 6 files changed, 22 insertions(+) diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json index e8e17250baf..5ec8d5acbb3 100644 --- a/client/src/__locales/en.json +++ b/client/src/__locales/en.json @@ -7,6 +7,8 @@ "parallel_requests": "Parallel requests", "load_balancing": "Load-balancing", "load_balancing_desc": "Query one upstream server at a time.
AdGuard Home uses a weighted random algorithm to select servers with the lowest number of failed lookups and the lowest average lookup time.", + "random": "Random", + "random_desc": "Query a random upstream server for every new query.", "bootstrap_dns": "Bootstrap DNS servers", "bootstrap_dns_desc": "IP addresses of DNS servers used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams. Comments are not permitted.", "fallback_dns_title": "Fallback DNS servers", diff --git a/client/src/helpers/constants.ts b/client/src/helpers/constants.ts index d4e7c940954..8608f432cd4 100644 --- a/client/src/helpers/constants.ts +++ b/client/src/helpers/constants.ts @@ -392,6 +392,7 @@ export const DNS_REQUEST_OPTIONS = { PARALLEL: 'parallel', FASTEST_ADDR: 'fastest_addr', LOAD_BALANCING: 'load_balance', + RANDOM: 'random', }; export const DHCP_FORM_NAMES = { diff --git a/internal/dnsforward/http.go b/internal/dnsforward/http.go index 59f3fde8527..dab29a926a2 100644 --- a/internal/dnsforward/http.go +++ b/internal/dnsforward/http.go @@ -136,6 +136,7 @@ const ( jsonUpstreamModeLoadBalance jsonUpstreamMode = "load_balance" jsonUpstreamModeParallel jsonUpstreamMode = "parallel" jsonUpstreamModeFastestAddr jsonUpstreamMode = "fastest_addr" + jsonUpstreamModeRandom jsonUpstreamMode = "random" ) func (s *Server) getDNSConfig() (c *jsonDNSConfig) { @@ -180,6 +181,8 @@ func (s *Server) getDNSConfig() (c *jsonDNSConfig) { upstreamMode = jsonUpstreamModeParallel case UpstreamModeFastestAddr: upstreamMode = jsonUpstreamModeFastestAddr + case UpstreamModeRandom: + upstreamMode = jsonUpstreamModeRandom } defPTRUps, err := s.defaultLocalPTRUpstreams() @@ -265,6 +268,7 @@ func (req *jsonDNSConfig) checkUpstreamMode() (err error) { jsonUpstreamModeLoadBalance, jsonUpstreamModeParallel, jsonUpstreamModeFastestAddr: + jsonUpstreamModeRandom: return nil default: return fmt.Errorf("upstream_mode: incorrect value %q", um) @@ -563,6 +567,8 @@ func mustParseUpstreamMode(mode jsonUpstreamMode) (um UpstreamMode) { return UpstreamModeParallel case jsonUpstreamModeFastestAddr: return UpstreamModeFastestAddr + case jsonUpstreamModeRandom: + return UpstreamModeRandom default: // Should never happen, since the value should be validated. panic(fmt.Errorf("unexpected upstream mode: %q", mode)) diff --git a/internal/dnsforward/http_internal_test.go b/internal/dnsforward/http_internal_test.go index f57783c7d05..80ae6ced9d4 100644 --- a/internal/dnsforward/http_internal_test.go +++ b/internal/dnsforward/http_internal_test.go @@ -123,6 +123,14 @@ func TestDNSForwardHTTP_handleGetConfig(t *testing.T) { return conf }, name: "parallel", + }, { + conf: func() ServerConfig { + conf := defaultConf + conf.UpstreamMode = UpstreamModeRandom + + return conf + }, + name: "random", }} var data map[string]json.RawMessage diff --git a/internal/dnsforward/upstreams.go b/internal/dnsforward/upstreams.go index 618601bd1bc..03a7923d4cb 100644 --- a/internal/dnsforward/upstreams.go +++ b/internal/dnsforward/upstreams.go @@ -137,6 +137,8 @@ func setProxyUpstreamMode( switch upstreamMode { case UpstreamModeParallel: conf.UpstreamMode = proxy.UpstreamModeParallel + case UpstreamModeRandom: + conf.UpstreamMode = proxy.UpstreamModeRandom case UpstreamModeFastestAddr: conf.UpstreamMode = proxy.UpstreamModeFastestAddr conf.FastestPingTimeout = fastestTimeout diff --git a/openapi/next.yaml b/openapi/next.yaml index c9fdee12b7e..011ca4bf32d 100644 --- a/openapi/next.yaml +++ b/openapi/next.yaml @@ -2510,10 +2510,13 @@ * `parallel`: Use parallel requests to speed up resolving by simultaneously querying all upstream servers. + + * `random`: Query a random upstream server for every new query. 'enum': - 'fastest' - 'load_balancing' - 'parallel' + - 'random' 'type': 'string' 'ErrorCode':