Bound completed toolsrv process retention

This commit is contained in:
Ollie Agent 2026-08-18 06:51:43 +02:00
parent b6009f0f7a
commit 6a4f83b5b2
2 changed files with 20 additions and 7 deletions

View File

@ -518,7 +518,10 @@ func (st *State) DismissProc(pid int) bool {
return true
}
const procGCTTL = 10 * time.Minute
const (
procGCTTL = 10 * time.Minute
procOutputLimit = 10 * 1024 * 1024
)
// StartProcGC runs a background goroutine that removes exited procs
// whose output has been read and whose LastRead is older than procGCTTL.
@ -545,8 +548,9 @@ func (st *State) gcProcs() {
p.mu.Lock()
exited := p.Exited
lastRead := p.LastRead
endTime := p.EndTime
p.mu.Unlock()
if exited && !lastRead.IsZero() && now.Sub(lastRead) >= procGCTTL {
if exited && ((!lastRead.IsZero() && now.Sub(lastRead) >= procGCTTL) || (!endTime.IsZero() && now.Sub(endTime) >= procGCTTL)) {
delete(st.procs, pid)
}
}
@ -697,7 +701,15 @@ type procWriter struct {
func (pw *procWriter) Write(p []byte) (int, error) {
pw.proc.mu.Lock()
defer pw.proc.mu.Unlock()
return pw.proc.output.Write(p)
remaining := procOutputLimit - pw.proc.output.Len()
if remaining > 0 {
if len(p) > remaining {
_, _ = pw.proc.output.Write(p[:remaining])
} else {
_, _ = pw.proc.output.Write(p)
}
}
return len(p), nil
}
// --- Proc Methods ---

View File

@ -235,9 +235,10 @@ func TestGcProcs(t *testing.T) {
}
// Add a proc that's exited but never read
st.procs[2] = &Proc{
ID: 2,
Exited: true,
done: make(chan struct{}),
ID: 2,
Exited: true,
EndTime: time.Now().Add(-20 * time.Minute),
done: make(chan struct{}),
}
// Add a proc that's exited and recently read
st.procs[3] = &Proc{
@ -263,7 +264,7 @@ func TestGcProcs(t *testing.T) {
if _, ok := st.procs[1]; ok {
t.Error("proc 1 should have been GC'd (exited, read >10min ago)")
}
if _, ok := st.procs[2]; !ok {
if _, ok := st.procs[2]; ok {
t.Error("proc 2 should NOT be GC'd (never read)")
}
if _, ok := st.procs[3]; !ok {