Kaynağa Gözat

Merge pull request #44749 from vvoland/fix-test-race-logs-goroutines

integration-cli: Fix hangs in TestLogsFollowGoroutines*
Sebastiaan van Stijn 2 yıl önce
ebeveyn
işleme
eaa7b49bd6
1 değiştirilmiş dosya ile 23 ekleme ve 5 silme
  1. 23 5
      integration-cli/docker_cli_logs_test.go

+ 23 - 5
integration-cli/docker_cli_logs_test.go

@@ -290,9 +290,17 @@ func (s *DockerCLILogsSuite) TestLogsFollowGoroutinesWithStdout(c *testing.T) {
 	assert.NilError(c, err)
 	cmd := exec.Command(dockerBinary, "logs", "-f", id)
 	r, w := io.Pipe()
+	defer r.Close()
+	defer w.Close()
+
 	cmd.Stdout = w
 	assert.NilError(c, cmd.Start())
-	go cmd.Wait()
+	defer cmd.Process.Kill()
+
+	finished := make(chan error)
+	go func() {
+		finished <- cmd.Wait()
+	}()
 
 	// Make sure pipe is written to
 	chErr := make(chan error)
@@ -300,11 +308,15 @@ func (s *DockerCLILogsSuite) TestLogsFollowGoroutinesWithStdout(c *testing.T) {
 		b := make([]byte, 1)
 		_, err := r.Read(b)
 		chErr <- err
+		r.Close()
 	}()
+
+	// Check read from pipe succeeded
 	assert.NilError(c, <-chErr)
+
 	assert.NilError(c, cmd.Process.Kill())
-	r.Close()
-	cmd.Wait()
+	<-finished
+
 	// NGoroutines is not updated right away, so we need to wait before failing
 	assert.NilError(c, waitForGoroutines(nroutines))
 }
@@ -318,10 +330,16 @@ func (s *DockerCLILogsSuite) TestLogsFollowGoroutinesNoOutput(c *testing.T) {
 	assert.NilError(c, err)
 	cmd := exec.Command(dockerBinary, "logs", "-f", id)
 	assert.NilError(c, cmd.Start())
-	go cmd.Wait()
+
+	finished := make(chan error)
+	go func() {
+		finished <- cmd.Wait()
+	}()
+
 	time.Sleep(200 * time.Millisecond)
 	assert.NilError(c, cmd.Process.Kill())
-	cmd.Wait()
+
+	<-finished
 
 	// NGoroutines is not updated right away, so we need to wait before failing
 	assert.NilError(c, waitForGoroutines(nroutines))