From 4ba7ad855ce7cde98693bf000b886fc119f5b214 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Fri, 5 Jul 2024 14:06:57 +0200 Subject: [PATCH] chunked: store compressed digest if validated if the compressed digest was validated, as it happens when 'pull_options = {convert_images = "true"}' is set, then store it as well so that reusing the blob by its compressed digest works. Previously, when an image converted to zstd:chunked was pulled a second time, it would not be recognized by its compressed digest, resulting in the need to re-pull the image again. Signed-off-by: Giuseppe Scrivano --- drivers/driver.go | 1 + layers.go | 2 ++ pkg/chunked/storage_linux.go | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/driver.go b/drivers/driver.go index c1495162e2..b37837b001 100644 --- a/drivers/driver.go +++ b/drivers/driver.go @@ -193,6 +193,7 @@ type DriverWithDifferOutput struct { UIDs []uint32 GIDs []uint32 UncompressedDigest digest.Digest + CompressedDigest digest.Digest Metadata string BigData map[string][]byte TarSplit []byte diff --git a/layers.go b/layers.go index f1325262b5..45800cff9f 100644 --- a/layers.go +++ b/layers.go @@ -2529,6 +2529,8 @@ func (r *layerStore) applyDiffFromStagingDirectory(id string, diffOutput *driver layer.GIDs = diffOutput.GIDs updateDigestMap(&r.byuncompressedsum, layer.UncompressedDigest, diffOutput.UncompressedDigest, layer.ID) layer.UncompressedDigest = diffOutput.UncompressedDigest + updateDigestMap(&r.bycompressedsum, diffOutput.CompressedDigest, diffOutput.CompressedDigest, layer.ID) + layer.CompressedDigest = diffOutput.CompressedDigest updateDigestMap(&r.bytocsum, diffOutput.TOCDigest, diffOutput.TOCDigest, layer.ID) layer.TOCDigest = diffOutput.TOCDigest layer.UncompressedSize = diffOutput.Size diff --git a/pkg/chunked/storage_linux.go b/pkg/chunked/storage_linux.go index f7a514e3b6..a9707b8c0a 100644 --- a/pkg/chunked/storage_linux.go +++ b/pkg/chunked/storage_linux.go @@ -1122,6 +1122,7 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff // stream to use for reading the zstd:chunked or Estargz file. stream := c.stream + var compressedDigest digest.Digest var uncompressedDigest digest.Digest var convertedBlobSize int64 @@ -1138,7 +1139,7 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff }() // calculate the checksum before accessing the file. - compressedDigest, err := c.copyAllBlobToFile(blobFile) + compressedDigest, err = c.copyAllBlobToFile(blobFile) if err != nil { return graphdriver.DriverWithDifferOutput{}, err } @@ -1224,6 +1225,7 @@ func (c *chunkedDiffer) ApplyDiff(dest string, options *archive.TarOptions, diff }, TOCDigest: c.tocDigest, UncompressedDigest: uncompressedDigest, + CompressedDigest: compressedDigest, } // When the hard links deduplication is used, file attributes are ignored because setting them