in pkg/gcv/parallelvalidator.go [99:127]
func (v *ParallelValidator) Review(ctx context.Context, request *validator.ReviewRequest) (*validator.ReviewResponse, error) {
assetCount := len(request.Assets)
// channel size of number of workers seems sufficient to prevent blocking,
// this is really just an assumption with no actual perf benchmarking.
resultChan := make(chan *assetResult, flags.workerCount)
defer close(resultChan)
go func() {
for idx, asset := range request.Assets {
v.work <- v.handleReview(ctx, idx, asset, resultChan)
}
}()
response := &validator.ReviewResponse{}
var errs multierror.Errors
for i := 0; i < assetCount; i++ {
result := <-resultChan
if result.err != nil {
errs.Add(result.err)
continue
}
response.Violations = append(response.Violations, result.violations...)
}
if !errs.Empty() {
return response, errs.ToError()
}
return response, nil
}