From 256b247e9fa9844c8e0760679411427d43b661c9 Mon Sep 17 00:00:00 2001 From: wangfengtu Date: Wed, 5 Sep 2018 15:16:28 +0800 Subject: [PATCH 63/94] docker: close openchan immediately to avoid error reason: close openchan immediately to avoid error Change-Id: I20664570518ea424088a4eb6a5aac3d38ac08449 Signed-off-by: wangfengtu --- libcontainer/container_linux.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libcontainer/container_linux.go b/libcontainer/container_linux.go index ba5dcd6..61ffb76 100644 --- a/libcontainer/container_linux.go +++ b/libcontainer/container_linux.go @@ -245,8 +245,7 @@ func (c *linuxContainer) exec() error { select { case <-awaitProcessExit(c.initProcess.pid(), fifoOpen): return errors.New("container process is already dead") - case result := <-awaitFifoOpen(path): - close(fifoOpen) + case result := <-awaitFifoOpen(path, fifoOpen): if result.err != nil { return result.err } @@ -283,7 +282,12 @@ func awaitProcessExit(pid int, exit <-chan struct{}) <-chan struct{} { case <-time.After(time.Millisecond * 100): stat, err := system.GetProcessState(pid) if err != nil || stat == system.Zombie { - close(isDead) + select { + case <-exit: + return + default: + close(isDead) + } return } } @@ -292,10 +296,11 @@ func awaitProcessExit(pid int, exit <-chan struct{}) <-chan struct{} { return isDead } -func awaitFifoOpen(path string) <-chan openResult { +func awaitFifoOpen(path string, fifoOpen chan struct{}) <-chan openResult { fifoOpened := make(chan openResult) go func() { f, err := os.OpenFile(path, os.O_RDONLY, 0) + close(fifoOpen) if err != nil { fifoOpened <- openResult{err: newSystemErrorWithCause(err, "open exec fifo for reading")} return -- 2.7.4.3