MCPcopy Create free account
hub / github.com/containers/image / blobPipelineDetectCompressionStep

Function blobPipelineDetectCompressionStep

copy/compression.go:47–80  ·  view source on GitHub ↗

blobPipelineDetectCompressionStep updates *stream to detect its current compression format. srcInfo is only used for error messages. Returns data for other steps.

(stream *sourceStream, srcInfo types.BlobInfo)

Source from the content-addressed store, hash-verified

45// srcInfo is only used for error messages.
46// Returns data for other steps.
47func blobPipelineDetectCompressionStep(stream *sourceStream, srcInfo types.BlobInfo) (bpDetectCompressionStepData, error) {
48 // This requires us to “peek ahead” into the stream to read the initial part, which requires us to chain through another io.Reader returned by DetectCompression.
49 format, decompressor, reader, err := compression.DetectCompressionFormat(stream.reader) // We could skip this in some cases, but let's keep the code path uniform
50 if err != nil {
51 return bpDetectCompressionStepData{}, fmt.Errorf("reading blob %s: %w", srcInfo.Digest, err)
52 }
53 stream.reader = reader
54
55 if decompressor != nil && format.Name() == compressiontypes.ZstdAlgorithmName {
56 tocDigest, err := chunkedToc.GetTOCDigest(srcInfo.Annotations)
57 if err != nil {
58 return bpDetectCompressionStepData{}, err
59 }
60 if tocDigest != nil {
61 format = compression.ZstdChunked
62 }
63
64 }
65 res := bpDetectCompressionStepData{
66 isCompressed: decompressor != nil,
67 format: format,
68 decompressor: decompressor,
69 }
70 if res.isCompressed {
71 res.srcCompressorBaseVariantName = format.BaseVariantName()
72 } else {
73 res.srcCompressorBaseVariantName = internalblobinfocache.Uncompressed
74 }
75
76 if expectedBaseFormat, known := expectedBaseCompressionFormats[stream.info.MediaType]; known && res.isCompressed && format.BaseVariantName() != expectedBaseFormat.Name() {
77 logrus.Debugf("blob %s with type %s should be compressed with %s, but compressor appears to be %s", srcInfo.Digest.String(), srcInfo.MediaType, expectedBaseFormat.Name(), format.Name())
78 }
79 return res, nil
80}
81
82// bpCompressionStepData contains data that the copy pipeline needs about the compression step.
83type bpCompressionStepData struct {

Callers 1

copyBlobFromStreamMethod · 0.85

Calls 4

DetectCompressionFormatFunction · 0.92
BaseVariantNameMethod · 0.80
NameMethod · 0.65
StringMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…