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

Method bpcRecompressCompressed

copy/compression.go:191–234  ·  view source on GitHub ↗

bpcRecompressCompressed checks if we should be recompressing a compressed input to another format, and returns a *bpCompressionStepData if so.

(stream *sourceStream, detected bpDetectCompressionStepData)

Source from the content-addressed store, hash-verified

189
190// bpcRecompressCompressed checks if we should be recompressing a compressed input to another format, and returns a *bpCompressionStepData if so.
191func (ic *imageCopier) bpcRecompressCompressed(stream *sourceStream, detected bpDetectCompressionStepData) (*bpCompressionStepData, error) {
192 if ic.c.dest.DesiredLayerCompression() == types.Compress && detected.isCompressed &&
193 ic.compressionFormat != nil &&
194 (ic.compressionFormat.Name() != detected.format.Name() && ic.compressionFormat.Name() != detected.format.BaseVariantName()) {
195 // When the blob is compressed, but the desired format is different, it first needs to be decompressed and finally
196 // re-compressed using the desired format.
197 logrus.Debugf("Blob will be converted")
198
199 decompressed, err := detected.decompressor(stream.reader)
200 if err != nil {
201 return nil, err
202 }
203 succeeded := false
204 defer func() {
205 if !succeeded {
206 decompressed.Close()
207 }
208 }()
209
210 recompressed, annotations := ic.compressedStream(decompressed, *ic.compressionFormat)
211 // Note: recompressed must be closed on all return paths.
212 stream.reader = recompressed
213 stream.info = types.BlobInfo{ // FIXME? Should we preserve more data in src.info? Notably the current approach correctly removes zstd:chunked metadata annotations.
214 Digest: "",
215 Size: -1,
216 }
217 specificVariantName := ic.compressionFormat.Name()
218 if specificVariantName == ic.compressionFormat.BaseVariantName() {
219 specificVariantName = internalblobinfocache.UnknownCompression
220 }
221 succeeded = true
222 return &bpCompressionStepData{
223 operation: bpcOpRecompressCompressed,
224 uploadedOperation: types.PreserveOriginal,
225 uploadedAlgorithm: ic.compressionFormat,
226 uploadedAnnotations: annotations,
227 srcCompressorBaseVariantName: detected.srcCompressorBaseVariantName,
228 uploadedCompressorBaseVariantName: ic.compressionFormat.BaseVariantName(),
229 uploadedCompressorSpecificVariantName: specificVariantName,
230 closers: []io.Closer{decompressed, recompressed},
231 }, nil
232 }
233 return nil, nil
234}
235
236// bpcDecompressCompressed checks if we should be decompressing a compressed input, and returns a *bpCompressionStepData if so.
237func (ic *imageCopier) bpcDecompressCompressed(stream *sourceStream, detected bpDetectCompressionStepData) (*bpCompressionStepData, error) {

Callers

nothing calls this directly

Calls 5

compressedStreamMethod · 0.95
BaseVariantNameMethod · 0.80
NameMethod · 0.65
CloseMethod · 0.65

Tested by

no test coverage detected