mirror of
https://github.com/containers/podman.git
synced 2025-10-18 03:33:32 +08:00
Add parameter to specify checkpoint archive compression
The checkpoint archive compression was hardcoded to `archive.Gzip`. There have been requests to make the used compression algorithm selectable. There was especially the request to not compress the checkpoint archive to be able to create faster checkpoints when not compressing it. This also changes the default from `gzip` to `zstd`. This change should not break anything as the restore code path automatically handles whatever compression the user provides during restore. Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:

committed by
Adrian Reber

parent
10875a67e4
commit
8aa5340ade
@ -1211,3 +1211,10 @@ func AutocompleteVolumeFilters(cmd *cobra.Command, args []string, toComplete str
|
||||
}
|
||||
return completeKeyValues(toComplete, kv)
|
||||
}
|
||||
|
||||
// AutocompleteCheckpointCompressType - Autocomplete checkpoint compress type options.
|
||||
// -> "gzip", "none", "zstd"
|
||||
func AutocompleteCheckpointCompressType(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
types := []string{"gzip", "none", "zstd"}
|
||||
return types, cobra.ShellCompDirectiveNoFileComp
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package containers
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/containers/common/pkg/completion"
|
||||
"github.com/containers/podman/v3/cmd/podman/common"
|
||||
@ -11,6 +12,7 @@ import (
|
||||
"github.com/containers/podman/v3/cmd/podman/validate"
|
||||
"github.com/containers/podman/v3/pkg/domain/entities"
|
||||
"github.com/containers/podman/v3/pkg/rootless"
|
||||
"github.com/containers/storage/pkg/archive"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
@ -36,9 +38,7 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
checkpointOptions entities.CheckpointOptions
|
||||
)
|
||||
var checkpointOptions entities.CheckpointOptions
|
||||
|
||||
func init() {
|
||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||
@ -60,11 +60,32 @@ func init() {
|
||||
flags.BoolVarP(&checkpointOptions.PreCheckPoint, "pre-checkpoint", "P", false, "Dump container's memory information only, leave the container running")
|
||||
flags.BoolVar(&checkpointOptions.WithPrevious, "with-previous", false, "Checkpoint container with pre-checkpoint images")
|
||||
|
||||
flags.StringP("compress", "c", "zstd", "Select compression algorithm (gzip, none, zstd) for checkpoint archive.")
|
||||
_ = checkpointCommand.RegisterFlagCompletionFunc("compress", common.AutocompleteCheckpointCompressType)
|
||||
|
||||
validate.AddLatestFlag(checkpointCommand, &checkpointOptions.Latest)
|
||||
}
|
||||
|
||||
func checkpoint(cmd *cobra.Command, args []string) error {
|
||||
var errs utils.OutputErrors
|
||||
if cmd.Flags().Changed("compress") {
|
||||
if checkpointOptions.Export == "" {
|
||||
return errors.Errorf("--compress can only be used with --export")
|
||||
}
|
||||
compress, _ := cmd.Flags().GetString("compress")
|
||||
switch strings.ToLower(compress) {
|
||||
case "none":
|
||||
checkpointOptions.Compression = archive.Uncompressed
|
||||
case "gzip":
|
||||
checkpointOptions.Compression = archive.Gzip
|
||||
case "zstd":
|
||||
checkpointOptions.Compression = archive.Zstd
|
||||
default:
|
||||
return errors.Errorf("Selected compression algorithm (%q) not supported. Please select one from: gzip, none, zstd", compress)
|
||||
}
|
||||
} else {
|
||||
checkpointOptions.Compression = archive.Zstd
|
||||
}
|
||||
if rootless.IsRootless() {
|
||||
return errors.New("checkpointing a container requires root")
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import (
|
||||
"github.com/containers/podman/v3/libpod/define"
|
||||
"github.com/containers/podman/v3/libpod/events"
|
||||
"github.com/containers/podman/v3/pkg/signal"
|
||||
"github.com/containers/storage/pkg/archive"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@ -776,6 +777,9 @@ type ContainerCheckpointOptions struct {
|
||||
// ImportPrevious tells the API to restore container with two
|
||||
// images. One is TargetFile, the other is ImportPrevious.
|
||||
ImportPrevious string
|
||||
// Compression tells the API which compression to use for
|
||||
// the exported checkpoint archive.
|
||||
Compression archive.Compression
|
||||
}
|
||||
|
||||
// Checkpoint checkpoints a container
|
||||
|
@ -985,7 +985,7 @@ func (c *Container) exportCheckpoint(options ContainerCheckpointOptions) error {
|
||||
}
|
||||
|
||||
input, err := archive.TarWithOptions(c.bundlePath(), &archive.TarOptions{
|
||||
Compression: archive.Gzip,
|
||||
Compression: options.Compression,
|
||||
IncludeSourceDir: true,
|
||||
IncludeFiles: includeFiles,
|
||||
})
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
"github.com/containers/image/v5/types"
|
||||
"github.com/containers/podman/v3/libpod/define"
|
||||
"github.com/containers/podman/v3/pkg/specgen"
|
||||
"github.com/containers/storage/pkg/archive"
|
||||
"github.com/cri-o/ocicni/pkg/ocicni"
|
||||
)
|
||||
|
||||
@ -178,6 +179,7 @@ type CheckpointOptions struct {
|
||||
TCPEstablished bool
|
||||
PreCheckPoint bool
|
||||
WithPrevious bool
|
||||
Compression archive.Compression
|
||||
}
|
||||
|
||||
type CheckpointReport struct {
|
||||
|
@ -483,6 +483,7 @@ func (ic *ContainerEngine) ContainerCheckpoint(ctx context.Context, namesOrIds [
|
||||
KeepRunning: options.LeaveRunning,
|
||||
PreCheckPoint: options.PreCheckPoint,
|
||||
WithPrevious: options.WithPrevious,
|
||||
Compression: options.Compression,
|
||||
}
|
||||
|
||||
if options.All {
|
||||
|
Reference in New Issue
Block a user