plugin/forward using pkg/up (#1493)

* plugin/forward: on demand healtchecking

Only start doing health checks when we encouner an error (any error).
This uses the new pluing/pkg/up package to abstract away the actual
checking. This reduces the LOC quite a bit; does need more testing, unit
testing and tcpdumping a bit.

* fix tests

* Fix readme

* Use pkg/up for healthchecks

* remove unused channel

* more cleanups

* update readme

* * Again do go generate and go build; still referencing the wrong forward
  repo? Anyway fixed.
* Use pkg/up for doing the healtchecks to cut back on unwanted queries
  * Change up.Func to return an error instead of a boolean.
  * Drop the string target argument as it doesn't make sense.
* Add healthcheck test on failing to get an upstream answer.

TODO(miek): double check Forward and Lookup and how they interact with
HC, and if we correctly call close() on those

* actual test

* Tests here

* more tests

* try getting rid of host

* Get rid of the host indirection

* Finish removing hosts

* moar testing

* import fmt

* field is not used

* docs

* move some stuff

* bring back health_check

* maxfails=0 test

* git and merging, bah

* review
This commit is contained in:
Miek Gieben
2018-02-15 10:21:57 +01:00
committed by GitHub
parent 8b035fa938
commit 16504234e5
15 changed files with 306 additions and 221 deletions

View File

@@ -62,25 +62,14 @@ func setup(c *caddy.Controller) error {
// OnStartup starts a goroutines for all proxies.
func (f *Forward) OnStartup() (err error) {
if f.hcInterval == 0 {
for _, p := range f.proxies {
p.host.fails = 0
}
return nil
}
for _, p := range f.proxies {
go p.healthCheck()
p.start(f.hcInterval)
}
return nil
}
// OnShutdown stops all configured proxies.
func (f *Forward) OnShutdown() error {
if f.hcInterval == 0 {
return nil
}
for _, p := range f.proxies {
p.close()
}
@@ -88,9 +77,7 @@ func (f *Forward) OnShutdown() error {
}
// Close is a synonym for OnShutdown().
func (f *Forward) Close() {
f.OnShutdown()
}
func (f *Forward) Close() { f.OnShutdown() }
func parseForward(c *caddy.Controller) (*Forward, error) {
f := New()
@@ -140,8 +127,8 @@ func parseForward(c *caddy.Controller) (*Forward, error) {
}
// We can't set tlsConfig here, because we haven't parsed it yet.
// We set it below at the end of parseBlock.
p := NewProxy(h)
// We set it below at the end of parseBlock, use nil now.
p := NewProxy(h, nil /* no TLS */)
f.proxies = append(f.proxies, p)
}
@@ -200,17 +187,11 @@ func parseBlock(c *caddy.Controller, f *Forward) error {
return fmt.Errorf("health_check can't be negative: %d", dur)
}
f.hcInterval = dur
for i := range f.proxies {
f.proxies[i].hcInterval = dur
}
case "force_tcp":
if c.NextArg() {
return c.ArgErr()
}
f.forceTCP = true
for i := range f.proxies {
f.proxies[i].forceTCP = true
}
case "tls":
args := c.RemainingArgs()
if len(args) != 3 {