MCPcopy
hub / github.com/containerd/containerd / GetDiffID

Function GetDiffID

core/images/diffid.go:33–82  ·  view source on GitHub ↗

GetDiffID gets the diff ID of the layer blob descriptor.

(ctx context.Context, cs content.Store, desc ocispec.Descriptor)

Source from the content-addressed store, hash-verified

31
32// GetDiffID gets the diff ID of the layer blob descriptor.
33func GetDiffID(ctx context.Context, cs content.Store, desc ocispec.Descriptor) (digest.Digest, error) {
34 switch desc.MediaType {
35 case
36 // If the layer is already uncompressed, we can just return its digest
37 MediaTypeDockerSchema2Layer,
38 ocispec.MediaTypeImageLayer,
39 MediaTypeDockerSchema2LayerForeign,
40 ocispec.MediaTypeImageLayerNonDistributable: //nolint:staticcheck // deprecated
41 return desc.Digest, nil
42 }
43 info, err := cs.Info(ctx, desc.Digest)
44 if err != nil {
45 return "", err
46 }
47 v, ok := info.Labels[labels.LabelUncompressed]
48 if ok {
49 // Fast path: if the image is already unpacked, we can use the label value
50 return digest.Parse(v)
51 }
52 // if the image is not unpacked, we may not have the label
53 ra, err := cs.ReaderAt(ctx, desc)
54 if err != nil {
55 return "", err
56 }
57 defer ra.Close()
58 r := content.NewReader(ra)
59 uR, err := compression.DecompressStream(r)
60 if err != nil {
61 return "", err
62 }
63 defer uR.Close()
64 digester := digest.Canonical.Digester()
65 hashW := digester.Hash()
66 if _, err := io.Copy(hashW, uR); err != nil {
67 return "", err
68 }
69 if err := ra.Close(); err != nil {
70 return "", err
71 }
72 digest := digester.Digest()
73 // memorize the computed value
74 if info.Labels == nil {
75 info.Labels = make(map[string]string)
76 }
77 info.Labels[labels.LabelUncompressed] = digest.String()
78 if _, err := cs.Update(ctx, info, "labels"); err != nil {
79 log.G(ctx).WithError(err).Warnf("failed to set %s label for %s", labels.LabelUncompressed, desc.Digest)
80 }
81 return digest, nil
82}

Callers 1

convertManifestMethod · 0.92

Calls 9

NewReaderFunction · 0.92
DecompressStreamFunction · 0.92
CopyMethod · 0.80
InfoMethod · 0.65
ReaderAtMethod · 0.65
CloseMethod · 0.65
DigestMethod · 0.65
UpdateMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…