From f14aea63c90821d7d1c4aed39f833e9c666bb09d Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Mon, 12 Oct 2020 21:44:30 +0000 Subject: [PATCH] "Fix" checkpoint on v2 runtime Checkpoint/Restore is horribly broken all around. But on the, now default, v2 runtime it's even more broken. This at least makes checkpoint equally broken on both runtimes. Signed-off-by: Brian Goff --- libcontainerd/remote/client.go | 41 ++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/libcontainerd/remote/client.go b/libcontainerd/remote/client.go index 02930eb852..1e58768a5b 100644 --- a/libcontainerd/remote/client.go +++ b/libcontainerd/remote/client.go @@ -511,26 +511,39 @@ func (c *client) Status(ctx context.Context, containerID string) (containerd.Pro return s.Status, nil } +func (c *client) getCheckpointOptions(id string, exit bool) containerd.CheckpointTaskOpts { + return func(r *containerd.CheckpointTaskInfo) error { + if r.Options == nil { + c.v2runcoptionsMu.Lock() + _, isV2 := c.v2runcoptions[id] + c.v2runcoptionsMu.Unlock() + + if isV2 { + r.Options = &v2runcoptions.CheckpointOptions{Exit: exit} + } else { + r.Options = &runctypes.CheckpointOptions{Exit: exit} + } + return nil + } + + switch opts := r.Options.(type) { + case *v2runcoptions.CheckpointOptions: + opts.Exit = exit + case *runctypes.CheckpointOptions: + opts.Exit = exit + } + + return nil + } +} + func (c *client) CreateCheckpoint(ctx context.Context, containerID, checkpointDir string, exit bool) error { p, err := c.getProcess(ctx, containerID, libcontainerdtypes.InitProcessName) if err != nil { return err } - opts := []containerd.CheckpointTaskOpts{} - if exit { - opts = append(opts, func(r *containerd.CheckpointTaskInfo) error { - if r.Options == nil { - r.Options = &runctypes.CheckpointOptions{ - Exit: true, - } - } else { - opts, _ := r.Options.(*runctypes.CheckpointOptions) - opts.Exit = true - } - return nil - }) - } + opts := []containerd.CheckpointTaskOpts{c.getCheckpointOptions(containerID, exit)} img, err := p.(containerd.Task).Checkpoint(ctx, opts...) if err != nil { return wrapError(err)