From 0155fe12609c84225fddd6e366ae80a3c74ce720 Mon Sep 17 00:00:00 2001 From: Chelsea Mafrica Date: Wed, 2 Dec 2020 14:28:31 -0800 Subject: [PATCH] shimv2: handle ctx passed by containerd Sometimes shim process cannot be shutdown because of container list is not empty. This container list is written in shim service, while creating container. We find that if containerd cancel its Create Container Request due to timeout, but runtime didn't handle it properly and continue creating action, then this container cannot be deleted at all. So we should make sure the ctx passed to Create Service rpc call is effective. Fixes #1088 Signed-off-by: Yves Chan Signed-off-by: Chelsea Mafrica --- src/runtime/containerd-shim-v2/service.go | 58 ++++++++++++++--------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/runtime/containerd-shim-v2/service.go b/src/runtime/containerd-shim-v2/service.go index 62c441df5..d6b9f9773 100644 --- a/src/runtime/containerd-shim-v2/service.go +++ b/src/runtime/containerd-shim-v2/service.go @@ -343,34 +343,46 @@ func (s *service) Create(ctx context.Context, r *taskAPI.CreateTaskRequest) (_ * s.mu.Lock() defer s.mu.Unlock() - var c *container - - c, err = create(ctx, s, r) - if err != nil { - return nil, err + type Result struct { + container *container + err error } + ch := make(chan Result, 1) + go func() { + container, err := create(ctx, s, r) + ch <- Result{container, err} + }() - c.status = task.StatusCreated + select { + case <-ctx.Done(): + return nil, errors.Errorf("create container timeout: %v", r.ID) + case res := <-ch: + if res.err != nil { + return nil, res.err + } + container := res.container + container.status = task.StatusCreated - s.containers[r.ID] = c + s.containers[r.ID] = container - s.send(&eventstypes.TaskCreate{ - ContainerID: r.ID, - Bundle: r.Bundle, - Rootfs: r.Rootfs, - IO: &eventstypes.TaskIO{ - Stdin: r.Stdin, - Stdout: r.Stdout, - Stderr: r.Stderr, - Terminal: r.Terminal, - }, - Checkpoint: r.Checkpoint, - Pid: s.pid, - }) + s.send(&eventstypes.TaskCreate{ + ContainerID: r.ID, + Bundle: r.Bundle, + Rootfs: r.Rootfs, + IO: &eventstypes.TaskIO{ + Stdin: r.Stdin, + Stdout: r.Stdout, + Stderr: r.Stderr, + Terminal: r.Terminal, + }, + Checkpoint: r.Checkpoint, + Pid: s.pid, + }) - return &taskAPI.CreateTaskResponse{ - Pid: s.pid, - }, nil + return &taskAPI.CreateTaskResponse{ + Pid: s.pid, + }, nil + } } // Start a process