From 68e4c211f25bfb344516572c2a6d132c4a76d0bc Mon Sep 17 00:00:00 2001 From: Simon Pasquier Date: Fri, 18 Jan 2019 09:55:47 +0100 Subject: [PATCH] discovery/azure: more robust handling of go routines (#5106) Signed-off-by: Simon Pasquier --- discovery/azure/azure.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/discovery/azure/azure.go b/discovery/azure/azure.go index 75485cd30..c0be9e38d 100644 --- a/discovery/azure/azure.go +++ b/discovery/azure/azure.go @@ -19,6 +19,7 @@ import ( "net" "net/http" "strings" + "sync" "time" "github.com/Azure/azure-sdk-for-go/arm/compute" @@ -324,9 +325,12 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) { err error } + var wg sync.WaitGroup + wg.Add(len(machines)) ch := make(chan target, len(machines)) for i, vm := range machines { go func(i int, vm virtualMachine) { + defer wg.Done() r, err := newAzureResourceFromID(vm.ID, d.logger) if err != nil { ch <- target{labelSet: nil, err: err} @@ -374,7 +378,6 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) { // is a cheap and easy way to determine if a machine is allocated or not. if networkInterface.Properties.Primary == nil { level.Debug(d.logger).Log("msg", "Skipping deallocated virtual machine", "machine", vm.Name) - ch <- target{} return } @@ -395,15 +398,13 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) { } } } - - // If we get here we haven't sent anything to the channel. - // We need to send it something to release it. - ch <- target{} }(i, vm) } - for range machines { - tgt := <-ch + wg.Wait() + close(ch) + + for tgt := range ch { if tgt.err != nil { return nil, fmt.Errorf("unable to complete Azure service discovery: %s", err) }