From bc7bd7202cb8be754b4308ab5c41419a8d67804d Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Fri, 18 Nov 2016 10:03:12 +0100 Subject: [PATCH] discovery: terminate senders before closing channel Fixes #2200 --- retrieval/discovery/consul/consul.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/retrieval/discovery/consul/consul.go b/retrieval/discovery/consul/consul.go index 58b2da806..114a1ece4 100644 --- a/retrieval/discovery/consul/consul.go +++ b/retrieval/discovery/consul/consul.go @@ -18,6 +18,7 @@ import ( "net" "strconv" "strings" + "sync" "time" consul "github.com/hashicorp/consul/api" @@ -132,7 +133,11 @@ func (cd *Discovery) shouldWatch(name string) bool { // Run implements the TargetProvider interface. func (cd *Discovery) Run(ctx context.Context, ch chan<- []*config.TargetGroup) { - defer close(ch) + var wg sync.WaitGroup + defer func() { + wg.Wait() + close(ch) + }() // Watched services and their cancelation functions. services := map[string]func(){} @@ -199,7 +204,11 @@ func (cd *Discovery) Run(ctx context.Context, ch chan<- []*config.TargetGroup) { } wctx, cancel := context.WithCancel(ctx) - go srv.watch(wctx, ch) + wg.Add(1) + go func() { + srv.watch(wctx, ch) + wg.Done() + }() services[name] = cancel }