mirror of
https://github.com/coredns/coredns.git
synced 2025-12-08 19:35:10 -05:00
Fix health race (#645)
* Revert "middleware/proxy: Make Unhealthy a pointer (#615)"
This reverts commit acbf522ceb.
* middleware/proxy: add proper locking
This add the proper locking around `Unhealthy`.
This commit is contained in:
@@ -84,11 +84,13 @@ func NewStaticUpstreams(c *caddyfile.Dispenser) ([]Upstream, error) {
|
||||
Conns: 0,
|
||||
Fails: 0,
|
||||
FailTimeout: upstream.FailTimeout,
|
||||
Unhealthy: newBool(),
|
||||
Unhealthy: false,
|
||||
|
||||
CheckDown: func(upstream *staticUpstream) UpstreamHostDownFunc {
|
||||
return func(uh *UpstreamHost) bool {
|
||||
if *uh.Unhealthy {
|
||||
uh.checkMu.Lock()
|
||||
defer uh.checkMu.Unlock()
|
||||
if uh.Unhealthy {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -251,19 +253,22 @@ func (u *staticUpstream) healthCheck() {
|
||||
|
||||
hostURL := "http://" + net.JoinHostPort(checkHostName, checkPort) + u.HealthCheck.Path
|
||||
|
||||
host.checkMu.Lock()
|
||||
defer host.checkMu.Unlock()
|
||||
|
||||
if r, err := http.Get(hostURL); err == nil {
|
||||
io.Copy(ioutil.Discard, r.Body)
|
||||
r.Body.Close()
|
||||
if r.StatusCode < 200 || r.StatusCode >= 400 {
|
||||
log.Printf("[WARNING] Health check URL %s returned HTTP code %d\n",
|
||||
hostURL, r.StatusCode)
|
||||
*host.Unhealthy = true
|
||||
host.Unhealthy = true
|
||||
} else {
|
||||
*host.Unhealthy = false
|
||||
host.Unhealthy = false
|
||||
}
|
||||
} else {
|
||||
log.Printf("[WARNING] Health check probe failed: %v\n", err)
|
||||
*host.Unhealthy = true
|
||||
host.Unhealthy = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -338,9 +343,3 @@ func (u *staticUpstream) IsAllowedDomain(name string) bool {
|
||||
}
|
||||
|
||||
func (u *staticUpstream) Exchanger() Exchanger { return u.ex }
|
||||
|
||||
func newBool() *bool {
|
||||
b := new(bool)
|
||||
*b = false
|
||||
return b
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user