Browse Source

Merge pull request #10362 from LK4D4/update_libcontainer

Update libcontainer to 2d3b5af7486f1a4e80a5ed91859d309b4eebf80c
Jessie Frazelle 10 years ago
parent
commit
acb8e08296
2 changed files with 18 additions and 7 deletions
  1. 2 1
      project/vendor.sh
  2. 16 6
      vendor/src/github.com/docker/libcontainer/namespaces/exec.go

+ 2 - 1
project/vendor.sh

@@ -68,7 +68,8 @@ if [ "$1" = '--go' ]; then
 	mv tmp-tar src/code.google.com/p/go/src/pkg/archive/tar
 fi
 
-clone git github.com/docker/libcontainer eb74393a3d2daeafbef4f5f27c0821cbdd67559c
+# this commit is from docker_1.5 branch in libcontainer, pls delete that branch when you'll update libcontainer again
+clone git github.com/docker/libcontainer 2d3b5af7486f1a4e80a5ed91859d309b4eebf80c
 # see src/github.com/docker/libcontainer/update-vendor.sh which is the "source of truth" for libcontainer deps (just like this file)
 rm -rf src/github.com/docker/libcontainer/vendor
 eval "$(grep '^clone ' src/github.com/docker/libcontainer/update-vendor.sh | grep -v 'github.com/codegangsta/cli')"

+ 16 - 6
vendor/src/github.com/docker/libcontainer/namespaces/exec.go

@@ -50,10 +50,20 @@ func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Wri
 	}
 	child.Close()
 
+	wait := func() (*os.ProcessState, error) {
+		ps, err := command.Process.Wait()
+		// we should kill all processes in cgroup when init is died if we use
+		// host PID namespace
+		if !container.Namespaces.Contains(libcontainer.NEWPID) {
+			killAllPids(container)
+		}
+		return ps, err
+	}
+
 	terminate := func(terr error) (int, error) {
 		// TODO: log the errors for kill and wait
 		command.Process.Kill()
-		command.Wait()
+		wait()
 		return -1, terr
 	}
 
@@ -109,16 +119,16 @@ func Exec(container *libcontainer.Config, stdin io.Reader, stdout, stderr io.Wri
 		startCallback()
 	}
 
-	if err := command.Wait(); err != nil {
+	ps, err := wait()
+	if err != nil {
 		if _, ok := err.(*exec.ExitError); !ok {
 			return -1, err
 		}
 	}
-	if !container.Namespaces.Contains(libcontainer.NEWPID) {
-		killAllPids(container)
-	}
+	// waiting for pipe flushing
+	command.Wait()
 
-	waitStatus := command.ProcessState.Sys().(syscall.WaitStatus)
+	waitStatus := ps.Sys().(syscall.WaitStatus)
 	if waitStatus.Signaled() {
 		return EXIT_SIGNAL_OFFSET + int(waitStatus.Signal()), nil
 	}