diff --git a/cache/refs.go b/cache/refs.go index 3bd534854..220c629f7 100644 --- a/cache/refs.go +++ b/cache/refs.go @@ -2,6 +2,7 @@ package cache import ( "context" + stderrors "errors" "fmt" "maps" "os" @@ -19,7 +20,6 @@ import ( "github.com/containerd/containerd/v2/core/snapshots" "github.com/containerd/containerd/v2/pkg/labels" cerrdefs "github.com/containerd/errdefs" - "github.com/hashicorp/go-multierror" "github.com/moby/buildkit/cache/config" "github.com/moby/buildkit/identity" "github.com/moby/buildkit/session" @@ -146,12 +146,15 @@ type diffParents struct { } // caller must hold cacheManager.mu -func (p parentRefs) release(ctx context.Context) (rerr error) { +func (p parentRefs) release(ctx context.Context) error { + var errs []error switch { case p.layerParent != nil: p.layerParent.mu.Lock() defer p.layerParent.mu.Unlock() - rerr = p.layerParent.release(ctx) + if err := p.layerParent.release(ctx); err != nil { + errs = append(errs, err) + } case len(p.mergeParents) > 0: for i, parent := range p.mergeParents { if parent == nil { @@ -159,7 +162,7 @@ func (p parentRefs) release(ctx context.Context) (rerr error) { } parent.mu.Lock() if err := parent.release(ctx); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) } else { p.mergeParents[i] = nil } @@ -170,7 +173,7 @@ func (p parentRefs) release(ctx context.Context) (rerr error) { p.diffParents.lower.mu.Lock() defer p.diffParents.lower.mu.Unlock() if err := p.diffParents.lower.release(ctx); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) } else { p.diffParents.lower = nil } @@ -179,14 +182,14 @@ func (p parentRefs) release(ctx context.Context) (rerr error) { p.diffParents.upper.mu.Lock() defer p.diffParents.upper.mu.Unlock() if err := p.diffParents.upper.release(ctx); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) } else { p.diffParents.upper = nil } } } - return rerr + return stderrors.Join(errs...) } func (p parentRefs) cloneParentRefs() parentRefs { @@ -598,18 +601,19 @@ func (cr *cacheRecord) layerDigestChain() []digest.Digest { type RefList []ImmutableRef -func (l RefList) Release(ctx context.Context) (rerr error) { +func (l RefList) Release(ctx context.Context) error { + var errs []error for i, r := range l { if r == nil { continue } if err := r.Release(ctx); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) } else { l[i] = nil } } - return rerr + return stderrors.Join(errs...) } func (sr *immutableRef) LayerChain() RefList { diff --git a/cmd/buildctl/prunehistories.go b/cmd/buildctl/prunehistories.go index 9c88b4fc3..e63e27889 100644 --- a/cmd/buildctl/prunehistories.go +++ b/cmd/buildctl/prunehistories.go @@ -2,12 +2,12 @@ package main import ( "context" + stderrors "errors" "fmt" "io" "text/tabwriter" "time" - "github.com/hashicorp/go-multierror" controlapi "github.com/moby/buildkit/api/services/control" bccommon "github.com/moby/buildkit/cmd/buildctl/common" "github.com/moby/buildkit/util/appcontext" @@ -42,12 +42,12 @@ func pruneHistories(clicontext *cli.Context) error { return err } - var rerr error if format := clicontext.String("format"); format != "" { tmpl, err := bccommon.ParseTemplate(format) if err != nil { return err } + var errs []error for { ev, err := resp.Recv() if errors.Is(err, io.EOF) { @@ -62,7 +62,7 @@ func pruneHistories(clicontext *cli.Context) error { Ref: ev.Record.Ref, Delete: true, }); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) continue } if err := tmpl.Execute(clicontext.App.Writer, ev); err != nil { @@ -72,7 +72,7 @@ func pruneHistories(clicontext *cli.Context) error { return err } } - return rerr + return stderrors.Join(errs...) } return pruneHistoriesWithTableOutput(ctx, clicontext.App.Writer, controlClient, resp) } @@ -82,7 +82,7 @@ func pruneHistoriesWithTableOutput(ctx context.Context, w io.Writer, controlClie ) error { tw := tabwriter.NewWriter(w, 1, 8, 1, '\t', 0) fmt.Fprintln(tw, "TYPE\tREF\tCREATED\tCOMPLETED\tGENERATION") - var rerr error + var errs []error for { ev, err := eventReceiver.Recv() if errors.Is(err, io.EOF) { @@ -98,7 +98,7 @@ func pruneHistoriesWithTableOutput(ctx context.Context, w io.Writer, controlClie Ref: ev.Record.Ref, Delete: true, }); err != nil { - rerr = multierror.Append(rerr, err).ErrorOrNil() + errs = append(errs, err) continue } var ( @@ -115,5 +115,5 @@ func pruneHistoriesWithTableOutput(ctx context.Context, w io.Writer, controlClie tw.Flush() } tw.Flush() - return rerr + return stderrors.Join(errs...) } diff --git a/cmd/buildkitd/main.go b/cmd/buildkitd/main.go index 64bc581a5..7caa1b40e 100644 --- a/cmd/buildkitd/main.go +++ b/cmd/buildkitd/main.go @@ -4,6 +4,7 @@ import ( "context" "crypto/tls" "crypto/x509" + stderrors "errors" "fmt" "net" "os" @@ -20,7 +21,6 @@ import ( "github.com/containerd/platforms" sddaemon "github.com/coreos/go-systemd/v22/daemon" "github.com/gofrs/flock" - "github.com/hashicorp/go-multierror" "github.com/moby/buildkit/cache/remotecache" "github.com/moby/buildkit/cache/remotecache/azblob" "github.com/moby/buildkit/cache/remotecache/gha" @@ -415,12 +415,13 @@ func main() { } app.After = func(_ *cli.Context) (err error) { + var errs []error for _, c := range closers { if e := c(context.TODO()); e != nil { - err = multierror.Append(err, e) + errs = append(errs, e) } } - return err + return stderrors.Join(errs...) } profiler.Attach(app) diff --git a/control/control.go b/control/control.go index 15aba411d..83a7f795c 100644 --- a/control/control.go +++ b/control/control.go @@ -2,6 +2,7 @@ package control import ( "context" + stderrors "errors" "fmt" "runtime/trace" "strconv" @@ -13,7 +14,6 @@ import ( "github.com/containerd/containerd/v2/core/content" "github.com/containerd/containerd/v2/plugins/services/content/contentserver" "github.com/distribution/reference" - "github.com/hashicorp/go-multierror" "github.com/mitchellh/hashstructure/v2" controlapi "github.com/moby/buildkit/api/services/control" apitypes "github.com/moby/buildkit/api/types" @@ -138,17 +138,20 @@ func NewController(opt Opt) (*Controller, error) { } func (c *Controller) Close() error { - rerr := c.opt.HistoryDB.Close() + var errs []error + if err := c.opt.HistoryDB.Close(); err != nil { + errs = append(errs, err) + } if err := c.opt.WorkerController.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } if err := c.opt.CacheStore.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } if err := c.solver.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } - return rerr + return stderrors.Join(errs...) } func (c *Controller) Register(server *grpc.Server) { diff --git a/go.mod b/go.mod index e744a923d..98a1ad130 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,6 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-immutable-radix/v2 v2.1.0 - github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/in-toto/in-toto-golang v0.9.0 github.com/klauspost/compress v1.18.0 @@ -158,6 +157,7 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/hanwen/go-fuse/v2 v2.6.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/moby/sys/mount v0.3.4 // indirect diff --git a/snapshot/diffapply_linux.go b/snapshot/diffapply_linux.go index 6ddc06c66..ec218783d 100644 --- a/snapshot/diffapply_linux.go +++ b/snapshot/diffapply_linux.go @@ -2,6 +2,7 @@ package snapshot import ( "context" + stderrors "errors" gofs "io/fs" "os" "path/filepath" @@ -14,7 +15,6 @@ import ( "github.com/containerd/containerd/v2/plugins/snapshots/overlay/overlayutils" "github.com/containerd/continuity/fs" "github.com/containerd/continuity/sysx" - "github.com/hashicorp/go-multierror" "github.com/moby/buildkit/identity" "github.com/moby/buildkit/util/bklog" "github.com/moby/buildkit/util/leaseutil" @@ -34,7 +34,7 @@ func (sn *mergeSnapshotter) diffApply(ctx context.Context, dest Mountable, diffs defer func() { releaseErr := a.Release() if releaseErr != nil { - rerr = multierror.Append(rerr, errors.Wrapf(releaseErr, "failed to release applier")).ErrorOrNil() + rerr = stderrors.Join(rerr, errors.Wrapf(releaseErr, "failed to release applier")) } }() @@ -84,7 +84,7 @@ func (sn *mergeSnapshotter) diffApply(ctx context.Context, dest Mountable, diffs return snapshots.Usage{}, errors.Wrapf(err, "failed to create differ") } defer func() { - rerr = multierror.Append(rerr, d.Release()).ErrorOrNil() + rerr = stderrors.Join(rerr, d.Release()) }() if err := d.HandleChanges(ctx, a.Apply); err != nil { return snapshots.Usage{}, errors.Wrapf(err, "failed to handle changes") @@ -146,7 +146,7 @@ func applierFor(dest Mountable, tryCrossSnapshotLink, userxattr bool) (_ *applie } defer func() { if rerr != nil { - rerr = multierror.Append(rerr, a.Release()).ErrorOrNil() + rerr = stderrors.Join(rerr, a.Release()) } }() if tryCrossSnapshotLink { @@ -191,7 +191,7 @@ func applierFor(dest Mountable, tryCrossSnapshotLink, userxattr bool) (_ *applie prevRelease := a.release a.release = func() error { err := mnter.Unmount() - return multierror.Append(err, prevRelease()).ErrorOrNil() + return stderrors.Join(err, prevRelease()) } } @@ -523,7 +523,7 @@ func differFor(lowerMntable, upperMntable Mountable) (_ *differ, rerr error) { } defer func() { if rerr != nil { - rerr = multierror.Append(rerr, d.Release()).ErrorOrNil() + rerr = stderrors.Join(rerr, d.Release()) } }() @@ -541,8 +541,7 @@ func differFor(lowerMntable, upperMntable Mountable) (_ *differ, rerr error) { d.lowerRoot = root lowerMnts = mnts d.releaseLower = func() error { - err := mounter.Unmount() - return multierror.Append(err, release()).ErrorOrNil() + return stderrors.Join(mounter.Unmount(), release()) } } @@ -560,8 +559,7 @@ func differFor(lowerMntable, upperMntable Mountable) (_ *differ, rerr error) { d.upperRoot = root upperMnts = mnts d.releaseUpper = func() error { - err := mounter.Unmount() - return multierror.Append(err, release()).ErrorOrNil() + return stderrors.Join(mounter.Unmount(), release()) } } @@ -779,7 +777,7 @@ func (d *differ) Release() error { } } if d.releaseUpper != nil { - err = multierror.Append(err, d.releaseUpper()).ErrorOrNil() + err = stderrors.Join(err, d.releaseUpper()) if err == nil { d.releaseUpper = nil } diff --git a/util/tracing/multi_span_exporter.go b/util/tracing/multi_span_exporter.go index d856de3b7..533e80d94 100644 --- a/util/tracing/multi_span_exporter.go +++ b/util/tracing/multi_span_exporter.go @@ -2,35 +2,29 @@ package tracing import ( "context" + stderrors "errors" - "github.com/hashicorp/go-multierror" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) type MultiSpanExporter []sdktrace.SpanExporter -func (m MultiSpanExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) (err error) { +func (m MultiSpanExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error { + var errs []error for _, exp := range m { if e := exp.ExportSpans(ctx, spans); e != nil { - if err != nil { - err = multierror.Append(err, e) - continue - } - err = e + errs = append(errs, e) } } - return err + return stderrors.Join(errs...) } -func (m MultiSpanExporter) Shutdown(ctx context.Context) (err error) { +func (m MultiSpanExporter) Shutdown(ctx context.Context) error { + var errs []error for _, exp := range m { if e := exp.Shutdown(ctx); e != nil { - if err != nil { - err = multierror.Append(err, e) - continue - } - err = e + errs = append(errs, e) } } - return err + return stderrors.Join(errs...) } diff --git a/worker/base/worker.go b/worker/base/worker.go index 1922b9dc6..7ad6db92c 100644 --- a/worker/base/worker.go +++ b/worker/base/worker.go @@ -2,6 +2,7 @@ package base import ( "context" + stderrors "errors" "fmt" "os" "path/filepath" @@ -13,7 +14,6 @@ import ( "github.com/containerd/containerd/v2/core/remotes/docker" "github.com/containerd/containerd/v2/pkg/gc" "github.com/containerd/platforms" - "github.com/hashicorp/go-multierror" "github.com/moby/buildkit/cache" "github.com/moby/buildkit/cache/metadata" "github.com/moby/buildkit/client" @@ -222,21 +222,21 @@ func (w *Worker) GarbageCollect(ctx context.Context) error { } func (w *Worker) Close() error { - var rerr error + var errs []error if err := w.MetadataStore.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } for _, provider := range w.NetworkProviders { if err := provider.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } } if w.ResourceMonitor != nil { if err := w.ResourceMonitor.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } } - return rerr + return stderrors.Join(errs...) } func (w *Worker) ContentStore() *containerdsnapshot.Store { diff --git a/worker/workercontroller.go b/worker/workercontroller.go index 1a1b568e2..79906a07e 100644 --- a/worker/workercontroller.go +++ b/worker/workercontroller.go @@ -1,8 +1,9 @@ package worker import ( + stderrors "errors" + "github.com/containerd/containerd/v2/pkg/filters" - "github.com/hashicorp/go-multierror" "github.com/moby/buildkit/cache" "github.com/moby/buildkit/client" "github.com/pkg/errors" @@ -16,13 +17,13 @@ type Controller struct { } func (c *Controller) Close() error { - var rerr error + var errs []error for _, w := range c.workers { if err := w.Close(); err != nil { - rerr = multierror.Append(rerr, err) + errs = append(errs, err) } } - return rerr + return stderrors.Join(errs...) } // Add adds a local worker.