diff --git a/cache/blobs_linux.go b/cache/blobs_linux.go index 07c5bcffc909..1ea5cbbf01a1 100644 --- a/cache/blobs_linux.go +++ b/cache/blobs_linux.go @@ -43,14 +43,27 @@ func (sr *immutableRef) tryComputeOverlayBlob(ctx context.Context, lower, upper if err != nil { return emptyDesc, false, errors.Wrap(err, "failed to open writer") } + defer func() { if cw != nil { + // after commit success cw will be set to nil, if cw isn't nil, error + // happened before commit, we should abort this ingest, and because the + // error may incured by ctx cancel, use a new context here. And since + // cm.Close will unlock this ref in the content store, we invoke abort + // to remove the ingest root in advance. + if aerr := sr.cm.ContentStore.Abort(context.Background(), ref); aerr != nil { + bklog.G(ctx).WithError(aerr).Warnf("failed to abort writer %q", ref) + } if cerr := cw.Close(); cerr != nil { bklog.G(ctx).WithError(cerr).Warnf("failed to close writer %q", ref) } } }() + if err = cw.Truncate(0); err != nil { + return emptyDesc, false, errors.Wrap(err, "failed to truncate writer") + } + bufW := bufio.NewWriterSize(cw, 128*1024) var labels map[string]string if compressorFunc != nil {