From 19a1ef48f28c5c46e4e8d69d31c8d7a2b579f43e Mon Sep 17 00:00:00 2001 From: Scott Donovan <38500910+sdonovan01@users.noreply.github.com> Date: Fri, 20 Apr 2018 01:07:58 -0500 Subject: [PATCH] adding sequential policy to forward plugin (#1704) * adding sequential policy to forward plugin * making sequential an alias to first in proxy plugin --- man/coredns-forward.7 | 2 +- plugin/forward/README.md | 2 +- plugin/forward/forward.go | 1 + plugin/forward/policy.go | 10 ++++++++++ plugin/forward/setup.go | 2 ++ plugin/forward/setup_policy_test.go | 1 + plugin/pkg/healthcheck/policy.go | 3 +++ plugin/proxy/README.md | 7 ++++--- 8 files changed, 23 insertions(+), 5 deletions(-) diff --git a/man/coredns-forward.7 b/man/coredns-forward.7 index e5e4c6503..7e6d0cc93 100644 --- a/man/coredns-forward.7 +++ b/man/coredns-forward.7 @@ -56,7 +56,7 @@ forward FROM TO\.\.\. { max_fails INTEGER tls CERT KEY CA tls_servername NAME - policy random|round_robin + policy random|round_robin|sequential health_check DURATION } . diff --git a/plugin/forward/README.md b/plugin/forward/README.md index 13f333197..b74154fb2 100644 --- a/plugin/forward/README.md +++ b/plugin/forward/README.md @@ -47,7 +47,7 @@ forward FROM TO... { max_fails INTEGER tls CERT KEY CA tls_servername NAME - policy random|round_robin + policy random|round_robin|sequential health_check DURATION } ~~~ diff --git a/plugin/forward/forward.go b/plugin/forward/forward.go index 8a65dad3e..6ad66d19b 100644 --- a/plugin/forward/forward.go +++ b/plugin/forward/forward.go @@ -193,6 +193,7 @@ type policy int const ( randomPolicy policy = iota roundRobinPolicy + sequentialPolicy ) const defaultTimeout = 5 * time.Second diff --git a/plugin/forward/policy.go b/plugin/forward/policy.go index f39a14105..1565fef31 100644 --- a/plugin/forward/policy.go +++ b/plugin/forward/policy.go @@ -53,3 +53,13 @@ func (r *roundRobin) List(p []*Proxy) []*Proxy { return robin } + +// sequential is a policy that selects hosts based on sequential ordering. +type sequential struct {} + +func (r *sequential) String() string { return "sequential" } + +func (r *sequential) List(p []*Proxy) []*Proxy { + return p +} + diff --git a/plugin/forward/setup.go b/plugin/forward/setup.go index 3582093ce..7afafc8a7 100644 --- a/plugin/forward/setup.go +++ b/plugin/forward/setup.go @@ -225,6 +225,8 @@ func parseBlock(c *caddy.Controller, f *Forward) error { f.p = &random{} case "round_robin": f.p = &roundRobin{} + case "sequential": + f.p = &sequential{} default: return c.Errf("unknown policy '%s'", x) } diff --git a/plugin/forward/setup_policy_test.go b/plugin/forward/setup_policy_test.go index 8c40b9fdd..986f3aa01 100644 --- a/plugin/forward/setup_policy_test.go +++ b/plugin/forward/setup_policy_test.go @@ -17,6 +17,7 @@ func TestSetupPolicy(t *testing.T) { // positive {"forward . 127.0.0.1 {\npolicy random\n}\n", false, "random", ""}, {"forward . 127.0.0.1 {\npolicy round_robin\n}\n", false, "round_robin", ""}, + {"forward . 127.0.0.1 {\npolicy sequential\n}\n", false, "sequential", ""}, // negative {"forward . 127.0.0.1 {\npolicy random2\n}\n", true, "random", "unknown policy"}, } diff --git a/plugin/pkg/healthcheck/policy.go b/plugin/pkg/healthcheck/policy.go index 3b8ade852..caab849fd 100644 --- a/plugin/pkg/healthcheck/policy.go +++ b/plugin/pkg/healthcheck/policy.go @@ -29,6 +29,9 @@ func init() { RegisterPolicy("least_conn", func() Policy { return &LeastConn{} }) RegisterPolicy("round_robin", func() Policy { return &RoundRobin{} }) RegisterPolicy("first", func() Policy { return &First{} }) + // 'sequential' is an alias to 'first' to maintain consistency with the forward plugin + // should probably remove 'first' in a future release + RegisterPolicy("sequential", func() Policy { return &First{} }) } // Random is a policy that selects up hosts from a pool at random. diff --git a/plugin/proxy/README.md b/plugin/proxy/README.md index 1da0ef4b7..0c0f737cc 100644 --- a/plugin/proxy/README.md +++ b/plugin/proxy/README.md @@ -25,7 +25,7 @@ However, advanced features including load balancing can be utilized with an expa ~~~ proxy FROM TO... { - policy random|least_conn|round_robin|first + policy random|least_conn|round_robin|sequential fail_timeout DURATION max_fails INTEGER health_check PATH:PORT [DURATION] @@ -39,7 +39,7 @@ proxy FROM TO... { * **TO** is the destination endpoint to proxy to. At least one is required, but multiple may be specified. **TO** may be an IP:Port pair, or may reference a file in resolv.conf format * `policy` is the load balancing policy to use; applies only with multiple backends. May be one of - random, least_conn, round_robin or first. Default is random. + random, least_conn, round_robin or sequential. Default is random. * `fail_timeout` specifies how long to consider a backend as down after it has failed. While it is down, requests will not be routed to that backend. A backend is "down" if CoreDNS fails to communicate with it. The default value is 2 seconds ("2s"). @@ -64,7 +64,8 @@ There are four load-balancing policies available: * `random` (default) - Randomly select a backend * `least_conn` - Select the backend with the fewest active connections * `round_robin` - Select the backend in round-robin fashion -* `first` - Select the first available backend looking by order of declaration from left to right +* `sequential` - Select the first available backend looking by order of declaration from left to right +* `first` - Deprecated. Use sequential instead All polices implement randomly spraying packets to backend hosts when *no healthy* hosts are