mirror of
https://github.com/traefik/traefik.git
synced 2025-08-17 20:17:05 +02:00
Wrr loadbalancer honors old weight on recovered servers
This commit is contained in:
parent
73e0561610
commit
40ab1f325c
@ -49,11 +49,16 @@ func (opt Options) String() string {
|
|||||||
return fmt.Sprintf("[Hostname: %s Headers: %v Path: %s Port: %d Interval: %s]", opt.Hostname, opt.Headers, opt.Path, opt.Port, opt.Interval)
|
return fmt.Sprintf("[Hostname: %s Headers: %v Path: %s Port: %d Interval: %s]", opt.Hostname, opt.Headers, opt.Path, opt.Port, opt.Interval)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type backendURL struct {
|
||||||
|
url *url.URL
|
||||||
|
weight int
|
||||||
|
}
|
||||||
|
|
||||||
// BackendConfig HealthCheck configuration for a backend
|
// BackendConfig HealthCheck configuration for a backend
|
||||||
type BackendConfig struct {
|
type BackendConfig struct {
|
||||||
Options
|
Options
|
||||||
name string
|
name string
|
||||||
disabledURLs []*url.URL
|
disabledURLs []backendURL
|
||||||
requestTimeout time.Duration
|
requestTimeout time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,18 +134,18 @@ func (hc *HealthCheck) execute(ctx context.Context, backend *BackendConfig) {
|
|||||||
|
|
||||||
func (hc *HealthCheck) checkBackend(backend *BackendConfig) {
|
func (hc *HealthCheck) checkBackend(backend *BackendConfig) {
|
||||||
enabledURLs := backend.LB.Servers()
|
enabledURLs := backend.LB.Servers()
|
||||||
var newDisabledURLs []*url.URL
|
var newDisabledURLs []backendURL
|
||||||
for _, url := range backend.disabledURLs {
|
for _, backendurl := range backend.disabledURLs {
|
||||||
serverUpMetricValue := float64(0)
|
serverUpMetricValue := float64(0)
|
||||||
if err := checkHealth(url, backend); err == nil {
|
if err := checkHealth(backendurl.url, backend); err == nil {
|
||||||
log.Warnf("Health check up: Returning to server list. Backend: %q URL: %q", backend.name, url.String())
|
log.Warnf("Health check up: Returning to server list. Backend: %q URL: %q Weight: %d", backend.name, backendurl.url.String(), backendurl.weight)
|
||||||
backend.LB.UpsertServer(url, roundrobin.Weight(1))
|
backend.LB.UpsertServer(backendurl.url, roundrobin.Weight(backendurl.weight))
|
||||||
serverUpMetricValue = 1
|
serverUpMetricValue = 1
|
||||||
} else {
|
} else {
|
||||||
log.Warnf("Health check still failing. Backend: %q URL: %q Reason: %s", backend.name, url.String(), err)
|
log.Warnf("Health check still failing. Backend: %q URL: %q Reason: %s", backend.name, backendurl.url.String(), err)
|
||||||
newDisabledURLs = append(newDisabledURLs, url)
|
newDisabledURLs = append(newDisabledURLs, backendurl)
|
||||||
}
|
}
|
||||||
labelValues := []string{"backend", backend.name, "url", url.String()}
|
labelValues := []string{"backend", backend.name, "url", backendurl.url.String()}
|
||||||
hc.metrics.BackendServerUpGauge().With(labelValues...).Set(serverUpMetricValue)
|
hc.metrics.BackendServerUpGauge().With(labelValues...).Set(serverUpMetricValue)
|
||||||
}
|
}
|
||||||
backend.disabledURLs = newDisabledURLs
|
backend.disabledURLs = newDisabledURLs
|
||||||
@ -148,9 +153,18 @@ func (hc *HealthCheck) checkBackend(backend *BackendConfig) {
|
|||||||
for _, url := range enabledURLs {
|
for _, url := range enabledURLs {
|
||||||
serverUpMetricValue := float64(1)
|
serverUpMetricValue := float64(1)
|
||||||
if err := checkHealth(url, backend); err != nil {
|
if err := checkHealth(url, backend); err != nil {
|
||||||
log.Warnf("Health check failed: Remove from server list. Backend: %q URL: %q Reason: %s", backend.name, url.String(), err)
|
weight := 1
|
||||||
|
rr, ok := backend.LB.(*roundrobin.RoundRobin)
|
||||||
|
if ok {
|
||||||
|
var gotWeight bool
|
||||||
|
weight, gotWeight = rr.ServerWeight(url)
|
||||||
|
if !gotWeight {
|
||||||
|
weight = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Warnf("Health check failed: Remove from server list. Backend: %q URL: %q Weight: %d Reason: %s", backend.name, url.String(), weight, err)
|
||||||
backend.LB.RemoveServer(url)
|
backend.LB.RemoveServer(url)
|
||||||
backend.disabledURLs = append(backend.disabledURLs, url)
|
backend.disabledURLs = append(backend.disabledURLs, backendURL{url, weight})
|
||||||
serverUpMetricValue = 0
|
serverUpMetricValue = 0
|
||||||
}
|
}
|
||||||
labelValues := []string{"backend", backend.name, "url", url.String()}
|
labelValues := []string{"backend", backend.name, "url", url.String()}
|
||||||
|
@ -112,7 +112,7 @@ func TestSetBackendsConfiguration(t *testing.T) {
|
|||||||
if test.startHealthy {
|
if test.startHealthy {
|
||||||
lb.servers = append(lb.servers, serverURL)
|
lb.servers = append(lb.servers, serverURL)
|
||||||
} else {
|
} else {
|
||||||
backend.disabledURLs = append(backend.disabledURLs, serverURL)
|
backend.disabledURLs = append(backend.disabledURLs, backendURL{serverURL, 1})
|
||||||
}
|
}
|
||||||
|
|
||||||
collectingMetrics := testhelpers.NewCollectingHealthCheckMetrics()
|
collectingMetrics := testhelpers.NewCollectingHealthCheckMetrics()
|
||||||
|
Loading…
Reference in New Issue
Block a user