Use faster gzip reader

Signed-off-by: Mario Loriedo <mario.loriedo@gmail.com>
This commit is contained in:
Mario Loriedo 2024-02-21 16:02:59 +01:00
parent 2245cf8dc4
commit 0b3f3f0ef1
7 changed files with 14 additions and 12 deletions

View File

@ -6,6 +6,7 @@ import (
"github.com/containers/podman/v5/pkg/machine/define" "github.com/containers/podman/v5/pkg/machine/define"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
) )
func Test_compressionFromFile(t *testing.T) { func Test_compressionFromFile(t *testing.T) {
@ -122,9 +123,9 @@ func Test_Decompress(t *testing.T) {
dstFilePath := tt.args.dst dstFilePath := tt.args.dst
defer os.Remove(dstFilePath) defer os.Remove(dstFilePath)
err := Decompress(srcVMFile, dstFilePath) err := Decompress(srcVMFile, dstFilePath)
assert.NoError(t, err) require.NoError(t, err)
data, err := os.ReadFile(dstFilePath) data, err := os.ReadFile(dstFilePath)
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, string(tt.want), string(data)) assert.Equal(t, string(tt.want), string(data))
}) })
} }

View File

@ -25,7 +25,7 @@ type decompressor interface {
compressedFileSize() int64 compressedFileSize() int64
compressedFileMode() os.FileMode compressedFileMode() os.FileMode
compressedFileReader() (io.ReadCloser, error) compressedFileReader() (io.ReadCloser, error)
decompress(w io.WriteSeeker, r io.Reader) error decompress(w WriteSeekCloser, r io.Reader) error
close() close()
} }

View File

@ -44,7 +44,7 @@ func (d *genericDecompressor) compressedFileReader() (io.ReadCloser, error) {
return compressedFile, nil return compressedFile, nil
} }
func (d *genericDecompressor) decompress(w io.WriteSeeker, r io.Reader) error { func (d *genericDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
decompressedFileReader, _, err := compression.AutoDecompress(r) decompressedFileReader, _, err := compression.AutoDecompress(r)
if err != nil { if err != nil {
return err return err

View File

@ -1,10 +1,9 @@
package compression package compression
import ( import (
"compress/gzip"
"io" "io"
crcOs "github.com/crc-org/crc/v2/pkg/os" image "github.com/containers/image/v5/pkg/compression"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -18,13 +17,15 @@ func newGzipDecompressor(compressedFilePath string) (*gzipDecompressor, error) {
return &gzipDecompressor{*d, nil}, err return &gzipDecompressor{*d, nil}, err
} }
func (d *gzipDecompressor) decompress(w io.WriteSeeker, r io.Reader) error { func (d *gzipDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
gzReader, err := gzip.NewReader(r) gzReader, err := image.GzipDecompressor(r)
if err != nil { if err != nil {
return err return err
} }
d.gzReader = gzReader d.gzReader = gzReader
_, err = crcOs.CopySparse(w, gzReader)
sparseWriter := NewSparseWriter(w)
_, err = io.Copy(sparseWriter, gzReader)
return err return err
} }

View File

@ -15,7 +15,7 @@ func newUncompressedDecompressor(compressedFilePath string) (*uncompressedDecomp
return &uncompressedDecompressor{*d}, err return &uncompressedDecompressor{*d}, err
} }
func (*uncompressedDecompressor) decompress(w io.WriteSeeker, r io.Reader) error { func (*uncompressedDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
_, err := crcOs.CopySparse(w, r) _, err := crcOs.CopySparse(w, r)
return err return err
} }

View File

@ -22,7 +22,7 @@ func newXzDecompressor(compressedFilePath string) (*xzDecompressor, error) {
// Will error out if file without .Xz already exists // Will error out if file without .Xz already exists
// Maybe extracting then renaming is a good idea here.. // Maybe extracting then renaming is a good idea here..
// depends on Xz: not pre-installed on mac, so it becomes a brew dependency // depends on Xz: not pre-installed on mac, so it becomes a brew dependency
func (*xzDecompressor) decompress(w io.WriteSeeker, r io.Reader) error { func (*xzDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
var cmd *exec.Cmd var cmd *exec.Cmd
var read io.Reader var read io.Reader

View File

@ -40,7 +40,7 @@ func (d *zipDecompressor) compressedFileReader() (io.ReadCloser, error) {
return z, nil return z, nil
} }
func (*zipDecompressor) decompress(w io.WriteSeeker, r io.Reader) error { func (*zipDecompressor) decompress(w WriteSeekCloser, r io.Reader) error {
_, err := io.Copy(w, r) _, err := io.Copy(w, r)
return err return err
} }