in pkg/migrate/migrate.go [72:120]
func run(ctx context.Context, sem chan struct{}, t MethodType, migrators ...Migrator) error {
var (
errors error
wg = sync.WaitGroup{}
results = make(chan error, len(migrators))
)
Loop:
for _, m := range migrators {
select {
case <-ctx.Done():
errors = multierr.Append(errors, fmt.Errorf("context closed during %T.%v: %w", m, t, ctx.Err()))
break Loop
case sem <- struct{}{}:
}
wg.Add(1)
go func(m Migrator) {
defer func() { <-sem }()
defer wg.Done()
var method func(ctx context.Context) error
switch t {
case CompleteMethod:
method = m.Complete
case ValidateMethod:
method = m.Validate
case MigrateMethod:
method = m.Migrate
default:
log.Errorf("Invalid method %v", t)
return
}
results <- method(ctx)
}(m)
}
wg.Wait()
close(results)
if errors != nil {
return errors
}
for err := range results {
if err != nil {
errors = multierr.Append(errors, err)
}
}
return errors
}