diff options
author | Matt Holt <mholt@users.noreply.github.com> | 2019-06-07 17:24:10 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-07 17:24:10 -0600 |
commit | 8947ae0cc1babf2ca6f8e01aa93cb13eebb3e854 (patch) | |
tree | 653f04705704c4f7757d4215fe5041dffec6d576 | |
parent | 37da91cfe703bc9f14ddec007092d39610a02861 (diff) | |
parent | 878ae0002ad777826ad3f8d764628a69dd543601 (diff) |
Merge pull request #1 from caddyserver/fix/goroutine-leak-healthchecker
fix goroutine leak in healthcheckers
-rwxr-xr-x | modules/caddyhttp/reverseproxy/healthchecker.go | 18 | ||||
-rwxr-xr-x | modules/caddyhttp/reverseproxy/upstream.go | 2 |
2 files changed, 14 insertions, 6 deletions
diff --git a/modules/caddyhttp/reverseproxy/healthchecker.go b/modules/caddyhttp/reverseproxy/healthchecker.go index add3aa0..39dca1b 100755 --- a/modules/caddyhttp/reverseproxy/healthchecker.go +++ b/modules/caddyhttp/reverseproxy/healthchecker.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 - for { - select { - case <-h.Ticker.C: - h.upstream.SetHealthiness(h.IsHealthy(url)) + 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. diff --git a/modules/caddyhttp/reverseproxy/upstream.go b/modules/caddyhttp/reverseproxy/upstream.go index b8a0330..db03954 100755 --- a/modules/caddyhttp/reverseproxy/upstream.go +++ b/modules/caddyhttp/reverseproxy/upstream.go @@ -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) |