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)
| 45 | // srcInfo is only used for error messages. |
| 46 | // Returns data for other steps. |
| 47 | func 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. |
| 83 | type bpCompressionStepData struct { |
no test coverage detected
searching dependent graphs…