From 6af6b1f997b881e5315d43c24a26b95d81b465b9 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 30 Mar 2015 13:27:38 -0700 Subject: [PATCH 1/3] Use proper wait function for --pid=host Signed-off-by: Alexander Morozov Upstream-commit: 489ab77f4aea9bc3e7ada751cab5d827040b1e8b Component: engine --- components/engine/daemon/execdriver/native/driver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/daemon/execdriver/native/driver.go b/components/engine/daemon/execdriver/native/driver.go index 030c3b5464..5938ffc3de 100644 --- a/components/engine/daemon/execdriver/native/driver.go +++ b/components/engine/daemon/execdriver/native/driver.go @@ -162,7 +162,7 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba logrus.Warnf("Your kernel does not support OOM notifications: %s", err) } waitF := p.Wait - if nss := cont.Config().Namespaces; nss.Contains(configs.NEWPID) { + if nss := cont.Config().Namespaces; !nss.Contains(configs.NEWPID) { // we need such hack for tracking processes with inerited fds, // because cmd.Wait() waiting for all streams to be copied waitF = waitInPIDHost(p, cont) From c6b7d50add3eb442650ec7a21f6e54130195652e Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 30 Mar 2015 13:28:34 -0700 Subject: [PATCH 2/3] Get child processes before main process die Signed-off-by: Alexander Morozov Upstream-commit: 5a1e5cf8c9bff51f6314754c039bf7511e2fb613 Component: engine --- components/engine/daemon/execdriver/native/driver.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/engine/daemon/execdriver/native/driver.go b/components/engine/daemon/execdriver/native/driver.go index 5938ffc3de..98c7ef3e33 100644 --- a/components/engine/daemon/execdriver/native/driver.go +++ b/components/engine/daemon/execdriver/native/driver.go @@ -189,6 +189,8 @@ func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*o return nil, err } + processes, err := c.Processes() + process, err := os.FindProcess(pid) s, err := process.Wait() if err != nil { From 9ce95596aba95f3a7d7e24def7847a31584e810a Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 30 Mar 2015 13:29:33 -0700 Subject: [PATCH 3/3] Do not mask *exec.ExitError Fix #11764 Signed-off-by: Alexander Morozov Upstream-commit: f468bbb7e8c89204bd5d8f346ecec4606b9f3b31 Component: engine --- .../engine/daemon/execdriver/native/driver.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/components/engine/daemon/execdriver/native/driver.go b/components/engine/daemon/execdriver/native/driver.go index 98c7ef3e33..816207ed37 100644 --- a/components/engine/daemon/execdriver/native/driver.go +++ b/components/engine/daemon/execdriver/native/driver.go @@ -169,11 +169,11 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba } ps, err := waitF() if err != nil { - if err, ok := err.(*exec.ExitError); !ok { + execErr, ok := err.(*exec.ExitError) + if !ok { return execdriver.ExitStatus{ExitCode: -1}, err - } else { - ps = err.ProcessState } + ps = execErr.ProcessState } cont.Destroy() @@ -194,13 +194,12 @@ func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*o process, err := os.FindProcess(pid) s, err := process.Wait() if err != nil { - if err, ok := err.(*exec.ExitError); !ok { + execErr, ok := err.(*exec.ExitError) + if !ok { return s, err - } else { - s = err.ProcessState } + s = execErr.ProcessState } - processes, err := c.Processes() if err != nil { return s, err }