diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go index 205eff7262..0b8f1943b2 100644 --- a/discovery/zookeeper/zookeeper.go +++ b/discovery/zookeeper/zookeeper.go @@ -93,6 +93,7 @@ func (d *Discovery) Run(ctx context.Context, ch chan<- []*config.TargetGroup) { for { select { case <-ctx.Done(): + return case event := <-d.updates: tg := &config.TargetGroup{ Source: event.Path, diff --git a/util/treecache/treecache.go b/util/treecache/treecache.go index 6f0e213b15..43af4cf6dc 100644 --- a/util/treecache/treecache.go +++ b/util/treecache/treecache.go @@ -168,7 +168,7 @@ func (tc *ZookeeperTreeCache) loop(path string) { failureMode = false } case <-tc.stop: - close(tc.events) + tc.recursiveStop(tc.head) return } } @@ -264,3 +264,13 @@ func (tc *ZookeeperTreeCache) recursiveDelete(path string, node *zookeeperTreeCa tc.recursiveDelete(path+"/"+name, childNode) } } + +func (tc *ZookeeperTreeCache) recursiveStop(node *zookeeperTreeCacheNode) { + if !node.stopped { + node.done <- struct{}{} + node.stopped = true + } + for _, childNode := range node.children { + tc.recursiveStop(childNode) + } +}