middleware/proxy: async health checks (#749)
* Switches out Unhealthy bool for OkUntil timestamp * Make sure servers are healthy forever if there are no health checks * Moves health check off into a go routine to avoid blocking conditions * Improved logging info * Fixes initial date * Fixes health checking; alters tests to adapt to async health checking * Moves future variable into static upstream and populates it in more places * Restores silencing of stdout during testing * Restores silencing of stdout during testing * keeps check url string once built * Removes debug message * uses zero value to signal no checking; reduces in-mutex code to a fetch
This commit is contained in:
parent
edf71fb168
commit
bb05a665eb
9 changed files with 158 additions and 60 deletions
|
@ -206,6 +206,7 @@ func newUpstream(hosts []string, old *staticUpstream) Upstream {
|
|||
Spray: nil,
|
||||
FailTimeout: 10 * time.Second,
|
||||
MaxFails: 3,
|
||||
Future: 60 * time.Second,
|
||||
ex: old.ex,
|
||||
WithoutPathPrefix: old.WithoutPathPrefix,
|
||||
IgnoredSubDomains: old.IgnoredSubDomains,
|
||||
|
@ -218,23 +219,30 @@ func newUpstream(hosts []string, old *staticUpstream) Upstream {
|
|||
Conns: 0,
|
||||
Fails: 0,
|
||||
FailTimeout: upstream.FailTimeout,
|
||||
Unhealthy: false,
|
||||
|
||||
CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc {
|
||||
return func(uh *UpstreamHost) bool {
|
||||
if uh.Unhealthy {
|
||||
return true
|
||||
|
||||
down := false
|
||||
|
||||
uh.checkMu.Lock()
|
||||
until := uh.OkUntil
|
||||
uh.checkMu.Unlock()
|
||||
|
||||
if !until.IsZero() && time.Now().After(until) {
|
||||
down = true
|
||||
}
|
||||
|
||||
fails := atomic.LoadInt32(&uh.Fails)
|
||||
if fails >= upstream.MaxFails && upstream.MaxFails != 0 {
|
||||
return true
|
||||
down = true
|
||||
}
|
||||
return false
|
||||
return down
|
||||
}
|
||||
}(upstream),
|
||||
WithoutPathPrefix: upstream.WithoutPathPrefix,
|
||||
}
|
||||
|
||||
upstream.Hosts[i] = uh
|
||||
}
|
||||
return upstream
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue