88 "io"
99 "os"
1010 "os/exec"
11- "sync"
1211
12+ "github.com/armon/circbuf"
1313 "k8s.io/klog/v2"
1414)
1515
@@ -31,7 +31,10 @@ type defaultProcessRunner struct {
3131}
3232
3333func (r * defaultProcessRunner ) Start (cmd * exec.Cmd ) (ProcessHandle , error ) {
34- stderrBuf := newTailBuf (r .stderrCapacity )
34+ stderrBuf , err := circbuf .NewBuffer (int64 (r .stderrCapacity ))
35+ if err != nil {
36+ return nil , err
37+ }
3538 if cmd .Stderr != nil {
3639 cmd .Stderr = io .MultiWriter (cmd .Stderr , stderrBuf )
3740 } else {
@@ -45,7 +48,7 @@ func (r *defaultProcessRunner) Start(cmd *exec.Cmd) (ProcessHandle, error) {
4548
4649type defaultProcessHandle struct {
4750 cmd * exec.Cmd
48- stderrBuf * tailBuf
51+ stderrBuf * circbuf. Buffer
4952}
5053
5154func (h * defaultProcessHandle ) Pid () int { return h .cmd .Process .Pid }
@@ -69,53 +72,3 @@ func (h *defaultProcessHandle) Wait() (int, []byte) {
6972func (h * defaultProcessHandle ) Signal (sig os.Signal ) error {
7073 return h .cmd .Process .Signal (sig )
7174}
72-
73- // tailBuf is a fixed-capacity ring buffer that retains the last N bytes written.
74- type tailBuf struct {
75- mu sync.Mutex
76- buf []byte
77- pos int
78- full bool
79- }
80-
81- func newTailBuf (capacity uint ) * tailBuf {
82- return & tailBuf {buf : make ([]byte , capacity )}
83- }
84-
85- func (tb * tailBuf ) Write (p []byte ) (int , error ) {
86- tb .mu .Lock ()
87- defer tb .mu .Unlock ()
88- n := len (p )
89- cap := len (tb .buf )
90- if cap == 0 {
91- return n , nil
92- }
93- if len (p ) >= cap {
94- copy (tb .buf , p [len (p )- cap :])
95- tb .pos = 0
96- tb .full = true
97- return n , nil
98- }
99- for len (p ) > 0 {
100- space := cap - tb .pos
101- copied := copy (tb .buf [tb .pos :], p [:min (len (p ), space )])
102- tb .pos = (tb .pos + copied ) % cap
103- if tb .pos == 0 || copied == space {
104- tb .full = true
105- }
106- p = p [copied :]
107- }
108- return n , nil
109- }
110-
111- func (tb * tailBuf ) Bytes () []byte {
112- tb .mu .Lock ()
113- defer tb .mu .Unlock ()
114- if ! tb .full {
115- return append ([]byte (nil ), tb .buf [:tb .pos ]... )
116- }
117- out := make ([]byte , len (tb .buf ))
118- n := copy (out , tb .buf [tb .pos :])
119- copy (out [n :], tb .buf [:tb .pos ])
120- return out
121- }
0 commit comments