diff --git a/pkgs/ioswitch/exec/executor.go b/pkgs/ioswitch/exec/executor.go index 4f0b3ca..50ed2d3 100644 --- a/pkgs/ioswitch/exec/executor.go +++ b/pkgs/ioswitch/exec/executor.go @@ -2,6 +2,7 @@ package exec import ( "context" + "errors" "fmt" "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 { lock := sync.Mutex{} + var err error var wg sync.WaitGroup wg.Add(len(ops)) for i, arg := range ops { - go func(arg Op, index int) { + go func(op Op, index int) { defer wg.Done() - if e := arg.Execute(ctx, s); e != nil { + if e := op.Execute(ctx, s); e != nil { lock.Lock() // 尽量不记录 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()