internal/pkg: move output buffer to reader
All checks were successful
Test / Create distribution (push) Successful in 58s
Test / Sandbox (push) Successful in 2m43s
Test / Hakurei (push) Successful in 3m39s
Test / ShareFS (push) Successful in 3m46s
Test / Sandbox (race detector) (push) Successful in 5m1s
Test / Hakurei (race detector) (push) Successful in 5m59s
Test / Flake checks (push) Successful in 2m18s

This side is the read end of a pipe and buffering reads from it ended up performing better than buffering one half of the TeeReader (which already goes through the kernel page cache anyway).

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-03-06 23:39:12 +09:00
parent 80f2367c16
commit 1e0d68a29e

View File

@@ -440,28 +440,23 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) {
} }
}() }()
bw := f.cache.getWriter(status) brStdout, brStderr := f.cache.getReader(stdout), f.cache.getReader(stderr)
stdoutDone, stderrDone := make(chan struct{}), make(chan struct{}) stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
go scanVerbose( go scanVerbose(
msg, cancel, stdoutDone, msg, cancel, stdoutDone,
"("+a.name+":1)", "("+a.name+":1)",
io.TeeReader(stdout, bw), io.TeeReader(brStdout, status),
) )
go scanVerbose( go scanVerbose(
msg, cancel, stderrDone, msg, cancel, stderrDone,
"("+a.name+":2)", "("+a.name+":2)",
io.TeeReader(stderr, bw), io.TeeReader(brStderr, status),
) )
defer func() { defer func() {
<-stdoutDone <-stdoutDone
<-stderrDone <-stderrDone
f.cache.putReader(brStdout)
flushErr := bw.Flush() f.cache.putReader(brStderr)
if err == nil {
err = flushErr
}
f.cache.putWriter(bw)
}() }()
} else { } else {
z.Stdout, z.Stderr = status, status z.Stdout, z.Stderr = status, status