From 04cb96662c7b8ef540c0f7f8c75060248aa65289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Duffeck?= Date: Wed, 29 Nov 2023 11:53:29 +0100 Subject: [PATCH] Read from stderr and stdout concurrently to prevent buffers from filling Without this change the stdout buffer could fill up, causing writes to stdout hang indefinitely. --- tests/ociswrapper/ocis/ocis.go | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/tests/ociswrapper/ocis/ocis.go b/tests/ociswrapper/ocis/ocis.go index 3160238035..9e75c5d16d 100644 --- a/tests/ociswrapper/ocis/ocis.go +++ b/tests/ociswrapper/ocis/ocis.go @@ -51,18 +51,29 @@ func Start(envMap map[string]any) { log.Panic(err) } - // Read and print the logs when the 'ocis server' command is running logScanner := bufio.NewScanner(logs) - for logScanner.Scan() { - m := logScanner.Text() - fmt.Println(m) - } - // Read output when the 'ocis server' command gets exited outputScanner := bufio.NewScanner(output) - for outputScanner.Scan() { - m := outputScanner.Text() - fmt.Println(m) - } + outChan := make(chan string) + + // Read the logs when the 'ocis server' command is running + go func() { + for logScanner.Scan() { + outChan <- logScanner.Text() + } + }() + + go func() { + for outputScanner.Scan() { + outChan <- outputScanner.Text() + } + }() + + // Fetch logs from the channel and print them + go func() { + for s := range outChan { + fmt.Println(s) + } + }() if err := cmd.Wait(); err != nil { if exitErr, ok := err.(*exec.ExitError); ok { @@ -82,6 +93,7 @@ func Start(envMap map[string]any) { Start(envMap) } } + close(outChan) } } }