in pkg/selector/selector.go [398:440]
func (s Selector) executeFilters(ctx context.Context, filterToInstanceSpecMapping map[string]filterPair, instanceType ec2types.InstanceType) (bool, error) {
verdict := make(chan bool, len(filterToInstanceSpecMapping)+1)
errs := make(chan error, len(filterToInstanceSpecMapping))
ctx, cancel := context.WithCancel(ctx)
defer cancel()
var wg sync.WaitGroup
for filterName, filter := range filterToInstanceSpecMapping {
wg.Add(1)
go func(ctx context.Context, filterName string, filter filterPair) {
defer wg.Done()
select {
case <-ctx.Done():
return
default:
ok, err := exec(instanceType, filterName, filter)
if err != nil {
errs <- err
}
if !ok {
verdict <- false
}
}
}(ctx, filterName, filter)
}
go func() {
wg.Wait()
verdict <- true
}()
if <-verdict {
return true, nil
}
cancel()
var err error
for {
select {
case e := <-errs:
err = multierr.Append(err, e)
default:
return false, err
}
}
}