integrating changes from #21768

Signed-off-by: Mario Loriedo <mario.loriedo@gmail.com>
This commit is contained in:
Mario Loriedo 2024-02-21 17:27:39 +01:00
parent fa99b9be93
commit ea4553d590
3 changed files with 41 additions and 8 deletions

View File

@ -61,12 +61,12 @@ func newDecompressor(compressedFilePath string, compressedFileContent []byte) (d
return newZipDecompressor(compressedFilePath) return newZipDecompressor(compressedFilePath)
case compressionType == archive.Uncompressed: case compressionType == archive.Uncompressed:
return newUncompressedDecompressor(compressedFilePath) return newUncompressedDecompressor(compressedFilePath)
// macOS gzipped VM images are sparse. As a result a // Using special compressors on MacOS because default ones
// special decompressor is required: it uses crc os.CopySparse // in c/image/pkg/compression are slow with sparse files.
// instead of io.Copy and std lib gzip instead of klauspost/pgzip
// (even if it's slower).
case compressionType == archive.Gzip && os == macOs: case compressionType == archive.Gzip && os == macOs:
return newGzipDecompressor(compressedFilePath) return newGzipDecompressor(compressedFilePath)
case compressionType == archive.Zstd && os == macOs:
return newZstdDecompressor(compressedFilePath)
default: default:
return newGenericDecompressor(compressedFilePath) return newGenericDecompressor(compressedFilePath)
} }

View File

@ -2,8 +2,6 @@ package compression
import ( import (
"io" "io"
crcOs "github.com/crc-org/crc/v2/pkg/os"
) )
type uncompressedDecompressor struct { type uncompressedDecompressor struct {
@ -15,7 +13,8 @@ func newUncompressedDecompressor(compressedFilePath string) (*uncompressedDecomp
return &uncompressedDecompressor{*d}, err return &uncompressedDecompressor{*d}, err
} }
func (*uncompressedDecompressor) decompress(w WriteSeekCloser, r io.Reader) error { func (d *uncompressedDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
_, err := crcOs.CopySparse(w, r) sparseWriter := NewSparseWriter(w)
_, err := io.Copy(sparseWriter, r)
return err return err
} }

View File

@ -0,0 +1,34 @@
package compression
import (
"io"
"github.com/klauspost/compress/zstd"
)
type zstdDecompressor struct {
genericDecompressor
zstdReader *zstd.Decoder
}
func newZstdDecompressor(compressedFilePath string) (*zstdDecompressor, error) {
d, err := newGenericDecompressor(compressedFilePath)
return &zstdDecompressor{*d, nil}, err
}
func (d *zstdDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
zstdReader, err := zstd.NewReader(r)
if err != nil {
return err
}
d.zstdReader = zstdReader
sparseWriter := NewSparseWriter(w)
_, err = io.Copy(sparseWriter, zstdReader)
return err
}
func (d *zstdDecompressor) close() {
d.zstdReader.Close()
d.genericDecompressor.close()
}