| @@ -2,6 +2,7 @@ package exec | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "errors" | |||||
| "fmt" | "fmt" | ||||
| "sync" | "sync" | ||||
| @@ -61,23 +62,24 @@ func (s *Executor) Run(ctx *ExecContext) (map[string]VarValue, error) { | |||||
| func (s *Executor) runOps(ops []Op, ctx *ExecContext, cancel context.CancelFunc) error { | func (s *Executor) runOps(ops []Op, ctx *ExecContext, cancel context.CancelFunc) error { | ||||
| lock := sync.Mutex{} | lock := sync.Mutex{} | ||||
| var err error | var err error | ||||
| var wg sync.WaitGroup | var wg sync.WaitGroup | ||||
| wg.Add(len(ops)) | wg.Add(len(ops)) | ||||
| for i, arg := range ops { | for i, arg := range ops { | ||||
| go func(arg Op, index int) { | |||||
| go func(op Op, index int) { | |||||
| defer wg.Done() | defer wg.Done() | ||||
| if e := arg.Execute(ctx, s); e != nil { | |||||
| if e := op.Execute(ctx, s); e != nil { | |||||
| lock.Lock() | lock.Lock() | ||||
| // 尽量不记录 Canceled 错误,除非没有其他错误 | // 尽量不记录 Canceled 错误,除非没有其他错误 | ||||
| if err == nil { | |||||
| err = e | |||||
| } else if err == context.Canceled { | |||||
| err = e | |||||
| } else if e != context.Canceled { | |||||
| err = multierror.Append(err, e) | |||||
| if errors.Is(e, context.Canceled) { | |||||
| if err == nil { | |||||
| err = context.Canceled | |||||
| } | |||||
| } else { | |||||
| err = multierror.Append(err, fmt.Errorf("%T: %w", op, e)) | |||||
| } | } | ||||
| lock.Unlock() | lock.Unlock() | ||||