From 878ae0002ad777826ad3f8d764628a69dd543601 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 7 Jun 2019 14:04:53 -0400 Subject: fix goroutine leak in healthcheckers --- modules/caddyhttp/reverseproxy/healthchecker.go | 18 +++++++++++++----- modules/caddyhttp/reverseproxy/upstream.go | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'modules/caddyhttp') 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) -- cgit v1.2.3