discovery/azure: more robust handling of go routines (#5106)

Signed-off-by: Simon Pasquier <spasquie@redhat.com>
This commit is contained in:
Simon Pasquier 2019-01-18 09:55:47 +01:00 committed by GitHub
parent a1f34bec2e
commit 68e4c211f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -19,6 +19,7 @@ import (
"net" "net"
"net/http" "net/http"
"strings" "strings"
"sync"
"time" "time"
"github.com/Azure/azure-sdk-for-go/arm/compute" "github.com/Azure/azure-sdk-for-go/arm/compute"
@ -324,9 +325,12 @@ func (d *Discovery) refresh() (tg *targetgroup.Group, err error) {
err error err error
} }
var wg sync.WaitGroup
wg.Add(len(machines))
ch := make(chan target, len(machines)) ch := make(chan target, len(machines))
for i, vm := range machines { for i, vm := range machines {
go func(i int, vm virtualMachine) { go func(i int, vm virtualMachine) {
defer wg.Done()
r, err := newAzureResourceFromID(vm.ID, d.logger) r, err := newAzureResourceFromID(vm.ID, d.logger)
if err != nil { if err != nil {
ch <- target{labelSet: nil, err: err} 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. // is a cheap and easy way to determine if a machine is allocated or not.
if networkInterface.Properties.Primary == nil { if networkInterface.Properties.Primary == nil {
level.Debug(d.logger).Log("msg", "Skipping deallocated virtual machine", "machine", vm.Name) level.Debug(d.logger).Log("msg", "Skipping deallocated virtual machine", "machine", vm.Name)
ch <- target{}
return 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) }(i, vm)
} }
for range machines { wg.Wait()
tgt := <-ch close(ch)
for tgt := range ch {
if tgt.err != nil { if tgt.err != nil {
return nil, fmt.Errorf("unable to complete Azure service discovery: %s", err) return nil, fmt.Errorf("unable to complete Azure service discovery: %s", err)
} }