Revert diff/walking error change

Clarify error scope and create variable for deferring cleanup

Signed-off-by: Derek McGowan <derek@mcg.dev>
This commit is contained in:
Derek McGowan 2021-06-03 14:19:50 -07:00
parent 6ae90906ab
commit 69f43d4589
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB

View File

@ -80,7 +80,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
var ocidesc ocispec.Descriptor var ocidesc ocispec.Descriptor
if err := mount.WithTempMount(ctx, lower, func(lowerRoot string) error { if err := mount.WithTempMount(ctx, lower, func(lowerRoot string) error {
return mount.WithTempMount(ctx, upper, func(upperRoot string) (retErr error) { return mount.WithTempMount(ctx, upper, func(upperRoot string) error {
var newReference bool var newReference bool
if config.Reference == "" { if config.Reference == "" {
newReference = true newReference = true
@ -95,8 +95,12 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
if err != nil { if err != nil {
return errors.Wrap(err, "failed to open writer") return errors.Wrap(err, "failed to open writer")
} }
// errOpen is set when an error occurs while the content writer has not been
// committed or closed yet to force a cleanup
var errOpen error
defer func() { defer func() {
if retErr != nil { if errOpen != nil {
cw.Close() cw.Close()
if newReference { if newReference {
if abortErr := s.store.Abort(ctx, config.Reference); abortErr != nil { if abortErr := s.store.Abort(ctx, config.Reference); abortErr != nil {
@ -106,22 +110,22 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
} }
}() }()
if !newReference { if !newReference {
if err = cw.Truncate(0); err != nil { if errOpen = cw.Truncate(0); errOpen != nil {
return err return errOpen
} }
} }
if isCompressed { if isCompressed {
dgstr := digest.SHA256.Digester() dgstr := digest.SHA256.Digester()
var compressed io.WriteCloser var compressed io.WriteCloser
compressed, err = compression.CompressStream(cw, compression.Gzip) compressed, errOpen = compression.CompressStream(cw, compression.Gzip)
if err != nil { if errOpen != nil {
return errors.Wrap(err, "failed to get compressed stream") return errors.Wrap(errOpen, "failed to get compressed stream")
} }
err = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash()), lowerRoot, upperRoot) errOpen = archive.WriteDiff(ctx, io.MultiWriter(compressed, dgstr.Hash()), lowerRoot, upperRoot)
compressed.Close() compressed.Close()
if err != nil { if errOpen != nil {
return errors.Wrap(err, "failed to write compressed diff") return errors.Wrap(errOpen, "failed to write compressed diff")
} }
if config.Labels == nil { if config.Labels == nil {
@ -129,8 +133,8 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
} }
config.Labels[uncompressed] = dgstr.Digest().String() config.Labels[uncompressed] = dgstr.Digest().String()
} else { } else {
if err = archive.WriteDiff(ctx, cw, lowerRoot, upperRoot); err != nil { if errOpen = archive.WriteDiff(ctx, cw, lowerRoot, upperRoot); errOpen != nil {
return errors.Wrap(err, "failed to write diff") return errors.Wrap(errOpen, "failed to write diff")
} }
} }
@ -140,10 +144,11 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
} }
dgst := cw.Digest() dgst := cw.Digest()
if err := cw.Commit(ctx, 0, dgst, commitopts...); err != nil { if errOpen = cw.Commit(ctx, 0, dgst, commitopts...); errOpen != nil {
if !errdefs.IsAlreadyExists(err) { if !errdefs.IsAlreadyExists(errOpen) {
return errors.Wrap(err, "failed to commit") return errors.Wrap(errOpen, "failed to commit")
} }
errOpen = nil
} }
info, err := s.store.Info(ctx, dgst) info, err := s.store.Info(ctx, dgst)