From f83e391aef03283b30431a960b66f720cf0d9dd3 Mon Sep 17 00:00:00 2001 From: jingrui Date: Mon, 11 Feb 2019 20:12:15 +0800 Subject: [PATCH 17/27] exit: using init.exit indicate container is exiting reason: testCE_docker_hook_spec_ABN.053.sh kill dockerd during docker stop in post-stophook, containerd will load task and treat as ok when shim response client. add init.exit to forbid load exiting task. Change-Id: I8f03cd51088d43d4fb457b32981f3eebd8558f84 Signed-off-by: jingrui --- runtime/v1/linux/proc/init.go | 1 + runtime/v1/linux/runtime.go | 5 +++++ runtime/v1/shim/service.go | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/runtime/v1/linux/proc/init.go b/runtime/v1/linux/proc/init.go index 5b23671..caa31c3 100644 --- a/runtime/v1/linux/proc/init.go +++ b/runtime/v1/linux/proc/init.go @@ -43,6 +43,7 @@ import ( // InitPidFile name of the file that contains the init pid const InitPidFile = "init.pid" +const InitExit = "init.exit" // Init represents an initial process for a container type Init struct { diff --git a/runtime/v1/linux/runtime.go b/runtime/v1/linux/runtime.go index 3b66304..123d675 100644 --- a/runtime/v1/linux/runtime.go +++ b/runtime/v1/linux/runtime.go @@ -378,6 +378,11 @@ func (r *Runtime) loadTasks(ctx context.Context, ns string) ([]*Task, error) { log.G(ctx).Warnf("delete force %s Pid=-1 error=%v", id, err) continue } + if _, err := os.Stat(filepath.Join(bundle.path, proc.InitExit)); err == nil { + _, err := t.DeleteForce(ctx) + log.G(ctx).Warnf("delete force %s Pid=%d(exiting) error=%v", id, pid, err) + continue + } log.G(ctx).Infof("load-task %s Pid=%d done", id, pid) o = append(o, t) } diff --git a/runtime/v1/shim/service.go b/runtime/v1/shim/service.go index 679982a..8c7984f 100644 --- a/runtime/v1/shim/service.go +++ b/runtime/v1/shim/service.go @@ -504,7 +504,9 @@ func (s *Service) checkProcesses(e runc.Exit) { for _, p := range s.processes { if p.Pid() == e.Pid { - + if ip, ok := p.(*proc.Init); ok { + ioutil.WriteFile(filepath.Join(ip.Bundle, proc.InitExit), []byte(fmt.Sprintf("%d", e.Pid)), 0600) + } if shouldKillAll { if ip, ok := p.(*proc.Init); ok { // Ensure all children are killed -- 2.7.4.3