Use Intel ISA-L's igzip if available
Intel ISA-L is Intel's open source (BSD) library that outperforms both gzip and pigz. This commit checks and uses igzip if available. Signed-off-by: Kazuyoshi Kato <kaz@fly.io>
This commit is contained in:
@@ -47,11 +47,14 @@ const (
|
||||
Zstd
|
||||
)
|
||||
|
||||
const disablePigzEnv = "CONTAINERD_DISABLE_PIGZ"
|
||||
const (
|
||||
disablePigzEnv = "CONTAINERD_DISABLE_PIGZ"
|
||||
disableIgzipEnv = "CONTAINERD_DISABLE_IGZIP"
|
||||
)
|
||||
|
||||
var (
|
||||
initPigz sync.Once
|
||||
unpigzPath string
|
||||
initGzip sync.Once
|
||||
gzipPath string
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -259,17 +262,20 @@ func (compression *Compression) Extension() string {
|
||||
}
|
||||
|
||||
func gzipDecompress(ctx context.Context, buf io.Reader) (io.ReadCloser, error) {
|
||||
initPigz.Do(func() {
|
||||
if unpigzPath = detectPigz(); unpigzPath != "" {
|
||||
log.L.Debug("using pigz for decompression")
|
||||
initGzip.Do(func() {
|
||||
if gzipPath = detectCommand("igzip", disableIgzipEnv); gzipPath != "" {
|
||||
log.L.Debug("using igzip for decompression")
|
||||
return
|
||||
}
|
||||
if gzipPath = detectCommand("unpigz", disablePigzEnv); gzipPath != "" {
|
||||
log.L.Debug("using unpigz for decompression")
|
||||
}
|
||||
})
|
||||
|
||||
if unpigzPath == "" {
|
||||
if gzipPath == "" {
|
||||
return gzip.NewReader(buf)
|
||||
}
|
||||
|
||||
return cmdStream(exec.CommandContext(ctx, unpigzPath, "-d", "-c"), buf)
|
||||
return cmdStream(exec.CommandContext(ctx, gzipPath, "-d", "-c"), buf)
|
||||
}
|
||||
|
||||
func cmdStream(cmd *exec.Cmd, in io.Reader) (io.ReadCloser, error) {
|
||||
@@ -296,22 +302,22 @@ func cmdStream(cmd *exec.Cmd, in io.Reader) (io.ReadCloser, error) {
|
||||
return reader, nil
|
||||
}
|
||||
|
||||
func detectPigz() string {
|
||||
path, err := exec.LookPath("unpigz")
|
||||
func detectCommand(path, disableEnvName string) string {
|
||||
path, err := exec.LookPath(path)
|
||||
if err != nil {
|
||||
log.L.WithError(err).Debug("unpigz not found, falling back to go gzip")
|
||||
log.L.WithError(err).Debugf("%s not found", path)
|
||||
return ""
|
||||
}
|
||||
|
||||
// Check if pigz disabled via CONTAINERD_DISABLE_PIGZ env variable
|
||||
value := os.Getenv(disablePigzEnv)
|
||||
// Check if this command is disabled via the env variable
|
||||
value := os.Getenv(disableEnvName)
|
||||
if value == "" {
|
||||
return path
|
||||
}
|
||||
|
||||
disable, err := strconv.ParseBool(value)
|
||||
if err != nil {
|
||||
log.L.WithError(err).Warnf("could not parse %s: %s", disablePigzEnv, value)
|
||||
log.L.WithError(err).Warnf("could not parse %s: %s", disableEnvName, value)
|
||||
return path
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user