Wrr loadbalancer honors old weight on recovered servers

This commit is contained in:
Douglas Wagner 2019-08-07 08:14:04 -07:00 committed by Traefiker Bot
parent 73e0561610
commit 40ab1f325c
2 changed files with 26 additions and 12 deletions

View File

@ -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()}

View File

@ -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()