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)
case compressionType == archive.Uncompressed:
return newUncompressedDecompressor(compressedFilePath)
// macOS gzipped VM images are sparse. As a result a
// special decompressor is required: it uses crc os.CopySparse
// instead of io.Copy and std lib gzip instead of klauspost/pgzip
// (even if it's slower).
// Using special compressors on MacOS because default ones
// in c/image/pkg/compression are slow with sparse files.
case compressionType == archive.Gzip && os == macOs:
return newGzipDecompressor(compressedFilePath)
case compressionType == archive.Zstd && os == macOs:
return newZstdDecompressor(compressedFilePath)
default:
return newGenericDecompressor(compressedFilePath)
}

View File

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