diff --git a/go.mod b/go.mod index df119ffa7..6dd7fa199 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf // indirect github.com/google/uuid v1.0.0 github.com/googleapis/gnostic v0.2.0 // indirect + github.com/hashicorp/go-multierror v1.0.0 github.com/hashicorp/golang-lru v0.5.0 // indirect github.com/hpcloud/tail v1.0.0 // indirect github.com/imdario/mergo v0.3.6 // indirect diff --git a/go.sum b/go.sum index 83af86258..1a1162347 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,10 @@ github.com/google/uuid v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gnostic v0.2.0 h1:l6N3VoaVzTncYYW+9yOz2LJJammFZGBO13sqgEhpy9g= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= diff --git a/internal/app/init/pkg/system/runner/containerd/import.go b/internal/app/init/pkg/system/runner/containerd/import.go index 417ca492b..b78894aeb 100644 --- a/internal/app/init/pkg/system/runner/containerd/import.go +++ b/internal/app/init/pkg/system/runner/containerd/import.go @@ -8,11 +8,12 @@ import ( "context" "log" "os" - "sync" "github.com/containerd/containerd" "github.com/containerd/containerd/defaults" "github.com/containerd/containerd/namespaces" + multierror "github.com/hashicorp/go-multierror" + "github.com/pkg/errors" "github.com/talos-systems/talos/internal/app/init/pkg/system/conditions" ) @@ -37,39 +38,43 @@ func Import(namespace string, reqs ...*ImportRequest) (err error) { // nolint: errcheck defer client.Close() - var wg sync.WaitGroup - - wg.Add(len(reqs)) + errCh := make(chan error) + var result *multierror.Error for _, req := range reqs { - go func(wg *sync.WaitGroup, r *ImportRequest) { - defer wg.Done() + go func(errCh chan<- error, r *ImportRequest) { + errCh <- func() error { - tarball, err := os.Open(r.Path) - if err != nil { - panic(err) - } - - imgs, err := client.Import(ctx, tarball, r.Options...) - if err != nil { - panic(err) - } - if err = tarball.Close(); err != nil { - panic(err) - } - - for _, img := range imgs { - image := containerd.NewImage(client, img) - log.Printf("unpacking %s (%s)\n", img.Name, img.Target.Digest) - err = image.Unpack(ctx, containerd.DefaultSnapshotter) + tarball, err := os.Open(r.Path) if err != nil { - panic(err) + return errors.Wrapf(err, "error opening %v", r.Path) } - } - }(&wg, req) + + imgs, err := client.Import(ctx, tarball, r.Options...) + if err != nil { + return errors.Wrapf(err, "error importing %v", r.Path) + } + if err = tarball.Close(); err != nil { + return errors.Wrapf(err, "error closing %v", r.Path) + } + + for _, img := range imgs { + image := containerd.NewImage(client, img) + log.Printf("unpacking %s (%s)\n", img.Name, img.Target.Digest) + err = image.Unpack(ctx, containerd.DefaultSnapshotter) + if err != nil { + return errors.Wrapf(err, "error unpacking %v", img.Name) + } + } + + return nil + }() + }(errCh, req) } - wg.Wait() + for range reqs { + result = multierror.Append(result, <-errCh) + } - return nil + return result.ErrorOrNil() }