mirror of
https://github.com/coredns/coredns.git
synced 2025-10-28 00:34:24 -04:00
middleware/proxy: fix race; add Go 1.7 backward compatibility (#603)
* Fix race on backend health status update * Ensure test case is compatible on Go 1.7
This commit is contained in:
committed by
Miek Gieben
parent
dfc71df07d
commit
7dc431ada3
@@ -3,6 +3,7 @@ package proxy
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -59,6 +60,7 @@ type UpstreamHost struct {
|
|||||||
Unhealthy bool
|
Unhealthy bool
|
||||||
CheckDown UpstreamHostDownFunc
|
CheckDown UpstreamHostDownFunc
|
||||||
WithoutPathPrefix string
|
WithoutPathPrefix string
|
||||||
|
checkMu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Down checks whether the upstream host is down or not.
|
// Down checks whether the upstream host is down or not.
|
||||||
|
|||||||
@@ -250,7 +250,9 @@ func (u *staticUpstream) healthCheck() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hostURL := "http://" + net.JoinHostPort(checkHostName, checkPort) + u.HealthCheck.Path
|
hostURL := "http://" + net.JoinHostPort(checkHostName, checkPort) + u.HealthCheck.Path
|
||||||
host.Unhealthy = false
|
|
||||||
|
host.checkMu.Lock()
|
||||||
|
defer host.checkMu.Unlock()
|
||||||
|
|
||||||
if r, err := http.Get(hostURL); err == nil {
|
if r, err := http.Get(hostURL); err == nil {
|
||||||
io.Copy(ioutil.Discard, r.Body)
|
io.Copy(ioutil.Discard, r.Body)
|
||||||
@@ -259,6 +261,8 @@ func (u *staticUpstream) healthCheck() {
|
|||||||
log.Printf("[WARNING] Health check URL %s returned HTTP code %d\n",
|
log.Printf("[WARNING] Health check URL %s returned HTTP code %d\n",
|
||||||
hostURL, r.StatusCode)
|
hostURL, r.StatusCode)
|
||||||
host.Unhealthy = true
|
host.Unhealthy = true
|
||||||
|
} else {
|
||||||
|
host.Unhealthy = false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Printf("[WARNING] Health check probe failed: %v\n", err)
|
log.Printf("[WARNING] Health check probe failed: %v\n", err)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -29,7 +30,11 @@ func TestProxyWithHTTPCheckOK(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
healthCheckPort := healthCheckURL.Port()
|
// TODO: use URL.Port() (Go 1.8+) once we've deprecated Go 1.7 support
|
||||||
|
var healthCheckPort string
|
||||||
|
if _, healthCheckPort, err = net.SplitHostPort(healthCheckURL.Host); err != nil {
|
||||||
|
healthCheckPort = "80"
|
||||||
|
}
|
||||||
|
|
||||||
name, rm, err := test.TempFile(".", exampleOrg)
|
name, rm, err := test.TempFile(".", exampleOrg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user