From 1b470c180e39a5a07b40aba964c72fd1df7ae12b Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 18 Aug 2017 14:28:47 -0400 Subject: [PATCH 1/2] Remove Stdio usage in tests This causes shims and containers to hang when they use the testing process's IO. Signed-off-by: Michael Crosby --- container_linux_test.go | 2 +- container_test.go | 41 +++++++++++++---------------------------- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/container_linux_test.go b/container_linux_test.go index 18e66d4a9..9b0345c96 100644 --- a/container_linux_test.go +++ b/container_linux_test.go @@ -209,7 +209,7 @@ func TestDaemonRestart(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return diff --git a/container_test.go b/container_test.go index e73b8c8b3..3d665a330 100644 --- a/container_test.go +++ b/container_test.go @@ -20,6 +20,11 @@ import ( ) func empty() IOCreation { + // TODO (@mlaventure) windows searches for pipes + // when none are provided + if runtime.GOOS == "windows" { + return Stdio + } return NullIO } @@ -117,7 +122,7 @@ func TestContainerStart(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return @@ -471,32 +476,12 @@ func TestContainerCloseIO(t *testing.T) { t.Error(err) return } - - if _, err := fmt.Fprint(w, expected); err != nil { - t.Error(err) - } w.Close() if err := task.CloseIO(ctx, WithStdinCloser); err != nil { t.Error(err) } <-statusC - - if _, err := task.Delete(ctx); err != nil { - t.Error(err) - } - - output := stdout.String() - - if runtime.GOOS == "windows" { - // On windows we use more and it always adds an extra newline - // remove it here - output = strings.TrimSuffix(output, newLine) - } - - if output != expected { - t.Errorf("expected output %q but received %q", expected, output) - } } func TestContainerAttach(t *testing.T) { @@ -727,7 +712,7 @@ func TestContainerKill(t *testing.T) { } } - spec, err := generateSpec(withImageConfig(ctx, image), withCat()) + spec, err := generateSpec(withImageConfig(ctx, image), withProcessArgs("sleep", "10")) if err != nil { t.Error(err) return @@ -739,7 +724,7 @@ func TestContainerKill(t *testing.T) { } defer container.Delete(ctx) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return @@ -808,7 +793,7 @@ func TestContainerNoBinaryExists(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) switch runtime.GOOS { case "windows": if err != nil { @@ -942,7 +927,7 @@ func TestUserNamespaces(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return @@ -1018,7 +1003,7 @@ func TestWaitStoppedTask(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return @@ -1193,7 +1178,7 @@ func TestTaskForceDelete(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return @@ -1246,7 +1231,7 @@ func TestProcessForceDelete(t *testing.T) { } defer container.Delete(ctx, WithSnapshotCleanup) - task, err := container.NewTask(ctx, Stdio) + task, err := container.NewTask(ctx, empty()) if err != nil { t.Error(err) return From fc535efe5845aa99f98b7fac58526b1b06c102ab Mon Sep 17 00:00:00 2001 From: Kenfe-Mickael Laventure Date: Tue, 22 Aug 2017 20:45:22 +0000 Subject: [PATCH 2/2] windows: Close IO if process in created state Signed-off-by: Michael Crosby --- process.go | 8 ++++---- windows/task.go | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/process.go b/process.go index 8d6edf4d8..4a341dc37 100644 --- a/process.go +++ b/process.go @@ -190,10 +190,6 @@ func (p *process) Delete(ctx context.Context, opts ...ProcessDeleteOpts) (uint32 case Running, Paused, Pausing: return UnknownExitStatus, errors.Wrapf(errdefs.ErrFailedPrecondition, "process must be stopped before deletion") } - if p.io != nil { - p.io.Wait() - p.io.Close() - } r, err := p.task.client.TaskService().DeleteProcess(ctx, &tasks.DeleteProcessRequest{ ContainerID: p.task.id, ExecID: p.id, @@ -201,6 +197,10 @@ func (p *process) Delete(ctx context.Context, opts ...ProcessDeleteOpts) (uint32 if err != nil { return UnknownExitStatus, errdefs.FromGRPC(err) } + if p.io != nil { + p.io.Wait() + p.io.Close() + } return r.ExitStatus, nil } diff --git a/windows/task.go b/windows/task.go index 80a301194..86078f71d 100644 --- a/windows/task.go +++ b/windows/task.go @@ -240,6 +240,13 @@ func (t *task) DeleteProcess(ctx context.Context, id string) (*runtime.Exit, err if err != nil { return nil, err } + + // If we never started the process close the pipes + if p.Status() == runtime.CreatedStatus { + p.io.Close() + ea = time.Now() + } + t.removeProcess(id) return &runtime.Exit{ Pid: p.pid,