mirror of
https://github.com/containers/podman.git
synced 2025-12-04 12:17:34 +08:00
Merge pull request #1848 from adrianreber/master
Add tcp-established to checkpoint/restore
This commit is contained in:
@@ -833,10 +833,16 @@ func (c *Container) Refresh(ctx context.Context) error {
|
||||
}
|
||||
|
||||
// ContainerCheckpointOptions is a struct used to pass the parameters
|
||||
// for checkpointing to corresponding functions
|
||||
// for checkpointing (and restoring) to the corresponding functions
|
||||
type ContainerCheckpointOptions struct {
|
||||
Keep bool
|
||||
// Keep tells the API to not delete checkpoint artifacts
|
||||
Keep bool
|
||||
// KeepRunning tells the API to keep the container running
|
||||
// after writing the checkpoint to disk
|
||||
KeepRunning bool
|
||||
// TCPEstablished tells the API to checkpoint a container
|
||||
// even if it contains established TCP connections
|
||||
TCPEstablished bool
|
||||
}
|
||||
|
||||
// Checkpoint checkpoints a container
|
||||
@@ -855,7 +861,7 @@ func (c *Container) Checkpoint(ctx context.Context, options ContainerCheckpointO
|
||||
}
|
||||
|
||||
// Restore restores a container
|
||||
func (c *Container) Restore(ctx context.Context, keep bool) (err error) {
|
||||
func (c *Container) Restore(ctx context.Context, options ContainerCheckpointOptions) (err error) {
|
||||
logrus.Debugf("Trying to restore container %s", c)
|
||||
if !c.batched {
|
||||
c.lock.Lock()
|
||||
@@ -866,5 +872,5 @@ func (c *Container) Restore(ctx context.Context, keep bool) (err error) {
|
||||
}
|
||||
}
|
||||
|
||||
return c.restore(ctx, keep)
|
||||
return c.restore(ctx, options)
|
||||
}
|
||||
|
||||
@@ -606,7 +606,7 @@ func (c *Container) init(ctx context.Context) error {
|
||||
}
|
||||
|
||||
// With the spec complete, do an OCI create
|
||||
if err := c.runtime.ociRuntime.createContainer(c, c.config.CgroupParent, false); err != nil {
|
||||
if err := c.runtime.ociRuntime.createContainer(c, c.config.CgroupParent, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@@ -514,7 +514,7 @@ func (c *Container) checkpoint(ctx context.Context, options ContainerCheckpointO
|
||||
return c.save()
|
||||
}
|
||||
|
||||
func (c *Container) restore(ctx context.Context, keep bool) (err error) {
|
||||
func (c *Container) restore(ctx context.Context, options ContainerCheckpointOptions) (err error) {
|
||||
|
||||
if !criu.CheckForCriu() {
|
||||
return errors.Errorf("restoring a container requires at least CRIU %d", criu.MinCriuVersion)
|
||||
@@ -602,7 +602,7 @@ func (c *Container) restore(ctx context.Context, keep bool) (err error) {
|
||||
// Cleanup for a working restore.
|
||||
c.removeConmonFiles()
|
||||
|
||||
if err := c.runtime.ociRuntime.createContainer(c, c.config.CgroupParent, true); err != nil {
|
||||
if err := c.runtime.ociRuntime.createContainer(c, c.config.CgroupParent, &options); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -610,7 +610,7 @@ func (c *Container) restore(ctx context.Context, keep bool) (err error) {
|
||||
|
||||
c.state.State = ContainerStateRunning
|
||||
|
||||
if !keep {
|
||||
if !options.Keep {
|
||||
// Delete all checkpoint related files. At this point, in theory, all files
|
||||
// should exist. Still ignoring errors for now as the container should be
|
||||
// restored and running. Not erroring out just because some cleanup operation
|
||||
|
||||
@@ -227,7 +227,7 @@ func bindPorts(ports []ocicni.PortMapping) ([]*os.File, error) {
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, restoreContainer bool) (err error) {
|
||||
func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, restoreOptions *ContainerCheckpointOptions) (err error) {
|
||||
var stderrBuf bytes.Buffer
|
||||
|
||||
runtimeDir, err := util.GetRootlessRuntimeDir()
|
||||
@@ -289,8 +289,11 @@ func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, res
|
||||
args = append(args, "--syslog")
|
||||
}
|
||||
|
||||
if restoreContainer {
|
||||
if restoreOptions != nil {
|
||||
args = append(args, "--restore", ctr.CheckpointPath())
|
||||
if restoreOptions.TCPEstablished {
|
||||
args = append(args, "--restore-arg", "--tcp-established")
|
||||
}
|
||||
}
|
||||
|
||||
logrus.WithFields(logrus.Fields{
|
||||
@@ -866,6 +869,9 @@ func (r *OCIRuntime) checkpointContainer(ctr *Container, options ContainerCheckp
|
||||
if options.KeepRunning {
|
||||
args = append(args, "--leave-running")
|
||||
}
|
||||
if options.TCPEstablished {
|
||||
args = append(args, "--tcp-established")
|
||||
}
|
||||
args = append(args, ctr.ID())
|
||||
return utils.ExecCmdWithStdStreams(os.Stdin, os.Stdout, os.Stderr, nil, r.path, args...)
|
||||
}
|
||||
|
||||
@@ -65,10 +65,10 @@ func newPipe() (parent *os.File, child *os.File, err error) {
|
||||
// CreateContainer creates a container in the OCI runtime
|
||||
// TODO terminal support for container
|
||||
// Presently just ignoring conmon opts related to it
|
||||
func (r *OCIRuntime) createContainer(ctr *Container, cgroupParent string, restoreContainer bool) (err error) {
|
||||
func (r *OCIRuntime) createContainer(ctr *Container, cgroupParent string, restoreOptions *ContainerCheckpointOptions) (err error) {
|
||||
if ctr.state.UserNSRoot == "" {
|
||||
// no need of an intermediate mount ns
|
||||
return r.createOCIContainer(ctr, cgroupParent, restoreContainer)
|
||||
return r.createOCIContainer(ctr, cgroupParent, restoreOptions)
|
||||
}
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
@@ -106,7 +106,7 @@ func (r *OCIRuntime) createContainer(ctr *Container, cgroupParent string, restor
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = r.createOCIContainer(ctr, cgroupParent, restoreContainer)
|
||||
err = r.createOCIContainer(ctr, cgroupParent, restoreOptions)
|
||||
}()
|
||||
wg.Wait()
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ func newPipe() (parent *os.File, child *os.File, err error) {
|
||||
return nil, nil, ErrNotImplemented
|
||||
}
|
||||
|
||||
func (r *OCIRuntime) createContainer(ctr *Container, cgroupParent string, restoreContainer bool) (err error) {
|
||||
func (r *OCIRuntime) createContainer(ctr *Container, cgroupParent string, restoreOptions *ContainerCheckpointOptions) (err error) {
|
||||
return ErrNotImplemented
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user