Browse Source
Merge pull request #1 from caddyserver/fix/goroutine-leak-healthchecker
fix goroutine leak in healthcheckers
master
Matt Holt
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
14 additions and
6 deletions
-
modules/caddyhttp/reverseproxy/healthchecker.go
-
modules/caddyhttp/reverseproxy/upstream.go
|
|
@ -15,24 +15,32 @@ type HealthChecker struct { |
|
|
|
upstream Upstream |
|
|
|
Ticker *time.Ticker |
|
|
|
HTTPClient *http.Client |
|
|
|
StopChan chan bool |
|
|
|
} |
|
|
|
|
|
|
|
// ScheduleChecks periodically runs health checks against an upstream host.
|
|
|
|
func (h *HealthChecker) ScheduleChecks(url string) { |
|
|
|
// check if a host is healthy on start vs waiting for timer
|
|
|
|
h.upstream.SetHealthiness(h.IsHealthy(url)) |
|
|
|
stop := make(chan bool) |
|
|
|
h.StopChan = stop |
|
|
|
|
|
|
|
go func() { |
|
|
|
for { |
|
|
|
select { |
|
|
|
case <-h.Ticker.C: |
|
|
|
h.upstream.SetHealthiness(h.IsHealthy(url)) |
|
|
|
case <-stop: |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
}() |
|
|
|
} |
|
|
|
|
|
|
|
// Stop stops the healthchecker from makeing further requests.
|
|
|
|
func (h *HealthChecker) Stop() { |
|
|
|
h.Ticker.Stop() |
|
|
|
close(h.StopChan) |
|
|
|
} |
|
|
|
|
|
|
|
// IsHealthy attempts to check if a upstream host is healthy.
|
|
|
|
|
|
@ -140,7 +140,7 @@ func NewLoadBalancedReverseProxy(lb *LoadBalanced, ctx caddy2.Context) error { |
|
|
|
// TODO :- if path is empty why does this empty the entire Target?
|
|
|
|
// nu.Target.Path = uc.HealthCheckPath
|
|
|
|
|
|
|
|
go nu.healthChecker.ScheduleChecks(nu.Target.String()) |
|
|
|
nu.healthChecker.ScheduleChecks(nu.Target.String()) |
|
|
|
lb.HealthCheckers = append(lb.HealthCheckers, nu.healthChecker) |
|
|
|
|
|
|
|
us = append(us, nu) |
|
|
|