summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorMatt Holt <mholt@users.noreply.github.com>2019-06-07 17:24:10 -0600
committerGitHub <noreply@github.com>2019-06-07 17:24:10 -0600
commit8947ae0cc1babf2ca6f8e01aa93cb13eebb3e854 (patch)
tree653f04705704c4f7757d4215fe5041dffec6d576 /modules
parent37da91cfe703bc9f14ddec007092d39610a02861 (diff)
parent878ae0002ad777826ad3f8d764628a69dd543601 (diff)
Merge pull request #1 from caddyserver/fix/goroutine-leak-healthchecker
fix goroutine leak in healthcheckers
Diffstat (limited to 'modules')
-rwxr-xr-xmodules/caddyhttp/reverseproxy/healthchecker.go18
-rwxr-xr-xmodules/caddyhttp/reverseproxy/upstream.go2
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)