From cb460a3ef9a95836a639a3875e8783021085fbbd Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Mon, 5 Oct 2015 20:21:50 -0400 Subject: [PATCH] Cleanup some issues with exec Signed-off-by: Brian Goff Upstream-commit: 561005e5ca00a8c24e83294e7005bdaf32f19d5a Component: engine --- components/engine/api/client/hijack.go | 5 ++--- components/engine/api/server/router/local/exec.go | 2 +- components/engine/daemon/container.go | 8 ++++---- components/engine/daemon/exec.go | 10 ++++++---- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/components/engine/api/client/hijack.go b/components/engine/api/client/hijack.go index 0cc57a2e74..ae09ad0f3c 100644 --- a/components/engine/api/client/hijack.go +++ b/components/engine/api/client/hijack.go @@ -239,14 +239,13 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea case err := <-receiveStdout: if err != nil { logrus.Debugf("Error receiveStdout: %s", err) - } - if cli.isTerminalIn { - return nil + return err } case <-stdinDone: if stdout != nil || stderr != nil { if err := <-receiveStdout; err != nil { logrus.Debugf("Error receiveStdout: %s", err) + return err } } } diff --git a/components/engine/api/server/router/local/exec.go b/components/engine/api/server/router/local/exec.go index d525ac1b82..aaafcd3e29 100644 --- a/components/engine/api/server/router/local/exec.go +++ b/components/engine/api/server/router/local/exec.go @@ -109,7 +109,7 @@ func (s *router) postContainerExecStart(ctx context.Context, w http.ResponseWrit if execStartCheck.Detach { return err } - fmt.Fprintf(outStream, "Error running exec in container: %v\n", err) + logrus.Errorf("Error running exec in container: %v\n", err) } return nil } diff --git a/components/engine/daemon/container.go b/components/engine/daemon/container.go index d3e0763c68..591c13e97d 100644 --- a/components/engine/daemon/container.go +++ b/components/engine/daemon/container.go @@ -790,7 +790,7 @@ func (container *Container) getExecIDs() []string { return container.execCommands.List() } -func (container *Container) exec(ExecConfig *ExecConfig) error { +func (container *Container) exec(ec *ExecConfig) error { container.Lock() defer container.Unlock() @@ -803,17 +803,17 @@ func (container *Container) exec(ExecConfig *ExecConfig) error { c.Close() } } - close(ExecConfig.waitStart) + close(ec.waitStart) return nil } // We use a callback here instead of a goroutine and an chan for // synchronization purposes - cErr := promise.Go(func() error { return container.monitorExec(ExecConfig, callback) }) + cErr := promise.Go(func() error { return container.monitorExec(ec, callback) }) // Exec should not return until the process is actually running select { - case <-ExecConfig.waitStart: + case <-ec.waitStart: case err := <-cErr: return err } diff --git a/components/engine/daemon/exec.go b/components/engine/daemon/exec.go index 99331ed257..31b26717ba 100644 --- a/components/engine/daemon/exec.go +++ b/components/engine/daemon/exec.go @@ -251,10 +251,9 @@ func (d *Daemon) ContainerExecStart(name string, stdin io.ReadCloser, stdout io. // the exitStatus) even after the cmd is done running. go func() { - if err := container.exec(ec); err != nil { - execErr <- derr.ErrorCodeExecCantRun.WithArgs(ec.ID, container.ID, err) - } + execErr <- container.exec(ec) }() + select { case err := <-attachErr: if err != nil { @@ -262,6 +261,9 @@ func (d *Daemon) ContainerExecStart(name string, stdin io.ReadCloser, stdout io. } return nil case err := <-execErr: + if aErr := <-attachErr; aErr != nil && err == nil { + return derr.ErrorCodeExecAttach.WithArgs(aErr) + } if err == nil { return nil } @@ -270,7 +272,7 @@ func (d *Daemon) ContainerExecStart(name string, stdin io.ReadCloser, stdout io. if !container.IsRunning() { return derr.ErrorCodeExecContainerStopped } - return err + return derr.ErrorCodeExecCantRun.WithArgs(ec.ID, container.ID, err) } }