Blame SOURCES/0001-fix-read-worker-output-using-io.Read.patch

1bad90
From d75dc60df73a88b0a14c799f3b6f1e8f66cee3d4 Mon Sep 17 00:00:00 2001
1bad90
From: Link Dupont <link@sub-pop.net>
1bad90
Date: Tue, 22 Nov 2022 13:07:41 -0500
1bad90
Subject: [PATCH] fix: read worker output using io.Read
1bad90
1bad90
Some workers output a lot of text to stderr and stdout. Rather than
1bad90
scanning stderr and stdout into a buffer using a bufio.Scanner, read a
1bad90
fixed number of bytes at a time. This will break lines of output from
1bad90
the worker in the middle of words, making reading stdout in the logs
1bad90
more difficult, but avoids the overly verbose workers from hitting the
1bad90
bufio.ErrTooLong error.
1bad90
1bad90
Signed-off-by: Link Dupont <link@sub-pop.net>
1bad90
---
1bad90
 cmd/yggd/exec.go | 46 +++++++++++++++++++++++++++++++++-------------
1bad90
 1 file changed, 33 insertions(+), 13 deletions(-)
1bad90
1bad90
diff --git a/cmd/yggd/exec.go b/cmd/yggd/exec.go
1bad90
index 4eb1757..a2a3d29 100644
1bad90
--- a/cmd/yggd/exec.go
1bad90
+++ b/cmd/yggd/exec.go
1bad90
@@ -1,8 +1,8 @@
1bad90
 package main
1bad90
 
1bad90
 import (
1bad90
-	"bufio"
1bad90
 	"fmt"
1bad90
+	"io"
1bad90
 	"io/ioutil"
1bad90
 	"os"
1bad90
 	"os/exec"
1bad90
@@ -54,22 +54,42 @@ func startProcess(file string, env []string, delay time.Duration, died chan int)
1bad90
 	log.Debugf("started process: %v", cmd.Process.Pid)
1bad90
 
1bad90
 	go func() {
1bad90
-		scanner := bufio.NewScanner(stdout)
1bad90
-		for scanner.Scan() {
1bad90
-			log.Tracef("[%v] %v", file, scanner.Text())
1bad90
-		}
1bad90
-		if err := scanner.Err(); err != nil {
1bad90
-			log.Errorf("cannot read from stdout: %v", err)
1bad90
+		for {
1bad90
+			buf := make([]byte, 4096)
1bad90
+			n, err := stdout.Read(buf)
1bad90
+			if n > 0 {
1bad90
+				log.Tracef("[%v] %v", file, strings.TrimRight(string(buf), "\n\x00"))
1bad90
+			}
1bad90
+			if err != nil {
1bad90
+				switch err {
1bad90
+				case io.EOF:
1bad90
+					log.Debugf("%v stdout reached EOF: %v", file, err)
1bad90
+					return
1bad90
+				default:
1bad90
+					log.Errorf("cannot read from stdout: %v", err)
1bad90
+					continue
1bad90
+				}
1bad90
+			}
1bad90
 		}
1bad90
 	}()
1bad90
 
1bad90
 	go func() {
1bad90
-		scanner := bufio.NewScanner(stderr)
1bad90
-		for scanner.Scan() {
1bad90
-			log.Errorf("[%v] %v", file, scanner.Text())
1bad90
-		}
1bad90
-		if err := scanner.Err(); err != nil {
1bad90
-			log.Errorf("cannot read from stderr: %v", err)
1bad90
+		for {
1bad90
+			buf := make([]byte, 4096)
1bad90
+			n, err := stderr.Read(buf)
1bad90
+			if n > 0 {
1bad90
+				log.Errorf("[%v] %v", file, strings.TrimRight(string(buf), "\n\x00"))
1bad90
+			}
1bad90
+			if err != nil {
1bad90
+				switch err {
1bad90
+				case io.EOF:
1bad90
+					log.Debugf("%v stderr reached EOF: %v", file, err)
1bad90
+					return
1bad90
+				default:
1bad90
+					log.Errorf("cannot read from stderr: %v", err)
1bad90
+					continue
1bad90
+				}
1bad90
+			}
1bad90
 		}
1bad90
 	}()
1bad90
 
1bad90
-- 
1bad90
2.38.1
1bad90