mirror of
https://github.com/coredns/coredns.git
synced 2025-11-12 23:12:17 -05:00
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:
@@ -17,8 +17,8 @@ type Probe struct {
|
||||
inprogress bool
|
||||
}
|
||||
|
||||
// Func is used to determine if a target is alive. If so this function must return true.
|
||||
type Func func(target string) bool
|
||||
// Func is used to determine if a target is alive. If so this function must return nil.
|
||||
type Func func() error
|
||||
|
||||
// New returns a pointer to an intialized Probe.
|
||||
func New() *Probe {
|
||||
@@ -32,9 +32,9 @@ func (p *Probe) Do(f Func) { p.do <- f }
|
||||
func (p *Probe) Stop() { p.stop <- true }
|
||||
|
||||
// Start will start the probe manager, after which probes can be initialized with Do.
|
||||
func (p *Probe) Start(target string, interval time.Duration) { go p.start(target, interval) }
|
||||
func (p *Probe) Start(interval time.Duration) { go p.start(interval) }
|
||||
|
||||
func (p *Probe) start(target string, interval time.Duration) {
|
||||
func (p *Probe) start(interval time.Duration) {
|
||||
for {
|
||||
select {
|
||||
case <-p.stop:
|
||||
@@ -52,9 +52,10 @@ func (p *Probe) start(target string, interval time.Duration) {
|
||||
// we return from the goroutine and we can accept another Func to run.
|
||||
go func() {
|
||||
for {
|
||||
if ok := f(target); ok {
|
||||
if err := f(); err == nil {
|
||||
break
|
||||
}
|
||||
// TODO(miek): little bit of exponential backoff here?
|
||||
time.Sleep(interval)
|
||||
}
|
||||
p.Lock()
|
||||
|
||||
Reference in New Issue
Block a user