From 14dbdf768e66da738714eadca17dcbe2a829adee Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Tue, 25 Jul 2023 10:07:36 +0200 Subject: [PATCH] chunked: skip validation for prefetched images if the image is created locally there is no need to validate again the files. Signed-off-by: Giuseppe Scrivano --- pkg/chunked/storage_linux.go | 71 ++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/pkg/chunked/storage_linux.go b/pkg/chunked/storage_linux.go index 4aee30668b..790cb52a7f 100644 --- a/pkg/chunked/storage_linux.go +++ b/pkg/chunked/storage_linux.go @@ -74,6 +74,8 @@ type chunkedDiffer struct { convertToZstdChunked bool + skipValidation bool + blobSize int64 storeOpts *types.StoreOptions @@ -935,8 +937,10 @@ func (c *chunkedDiffer) appendCompressedStreamToFile(compression compressedFileT if err := appendHole(int(destFile.file.Fd()), size); err != nil { return err } - if err := hashHole(destFile.hash, size, c.copyBuffer); err != nil { - return err + if destFile.hash != nil { + if err := hashHole(destFile.hash, size, c.copyBuffer); err != nil { + return err + } } default: return fmt.Errorf("unknown file type %q", c.fileType) @@ -945,33 +949,43 @@ func (c *chunkedDiffer) appendCompressedStreamToFile(compression compressedFileT } type destinationFile struct { - dirfd int - file *os.File - digester digest.Digester - hash hash.Hash - to io.Writer - metadata *internal.FileMetadata - options *archive.TarOptions + digester digest.Digester + dirfd int + file *os.File + hash hash.Hash + metadata *internal.FileMetadata + options *archive.TarOptions + skipValidation bool + to io.Writer } -func openDestinationFile(dirfd int, metadata *internal.FileMetadata, options *archive.TarOptions) (*destinationFile, error) { +func openDestinationFile(dirfd int, metadata *internal.FileMetadata, options *archive.TarOptions, skipValidation bool) (*destinationFile, error) { file, err := openFileUnderRoot(metadata.Name, dirfd, newFileFlags, 0) if err != nil { return nil, err } - digester := digest.Canonical.Digester() - hash := digester.Hash() - to := io.MultiWriter(file, hash) + var digester digest.Digester + var hash hash.Hash + var to io.Writer + + if skipValidation { + to = file + } else { + digester = digest.Canonical.Digester() + hash = digester.Hash() + to = io.MultiWriter(file, hash) + } return &destinationFile{ - file: file, - digester: digester, - hash: hash, - to: to, - metadata: metadata, - options: options, - dirfd: dirfd, + file: file, + digester: digester, + hash: hash, + to: to, + metadata: metadata, + options: options, + dirfd: dirfd, + skipValidation: skipValidation, }, nil } @@ -983,12 +997,14 @@ func (d *destinationFile) Close() (Err error) { } }() - manifestChecksum, err := digest.Parse(d.metadata.Digest) - if err != nil { - return err - } - if d.digester.Digest() != manifestChecksum { - return fmt.Errorf("checksum mismatch for %q (got %q instead of %q)", d.file.Name(), d.digester.Digest(), manifestChecksum) + if !d.skipValidation { + manifestChecksum, err := digest.Parse(d.metadata.Digest) + if err != nil { + return err + } + if d.digester.Digest() != manifestChecksum { + return fmt.Errorf("checksum mismatch for %q (got %q instead of %q)", d.file.Name(), d.digester.Digest(), manifestChecksum) + } } return setFileAttrs(d.dirfd, d.file, os.FileMode(d.metadata.Mode), d.metadata, d.options, false) @@ -1088,7 +1104,7 @@ func (c *chunkedDiffer) storeMissingFiles(streams chan io.ReadCloser, errs chan } filesToClose <- destFile } - destFile, err = openDestinationFile(dirfd, mf.File, options) + destFile, err = openDestinationFile(dirfd, mf.File, options, c.skipValidation) if err != nil { Err = err goto exit @@ -1512,6 +1528,7 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff c.fileType = fileTypeZstdChunked c.manifest = manifest c.convertToZstdChunked = false + c.skipValidation = true c.tarSplit = tarSplit // since we retrieved the whole file, use the diffID instead of the TOC digest. c.tocDigest = diffID