@@ -18,7 +18,6 @@ package server
1818
1919import (
2020 "bytes"
21- "errors"
2221 "fmt"
2322 "io"
2423 "syscall"
@@ -44,11 +43,9 @@ type cappedWriter struct {
4443 remain int
4544}
4645
47- var errNoRemain = errors .New ("no more space to write" )
48-
4946func (cw * cappedWriter ) Write (p []byte ) (int , error ) {
5047 if cw .remain <= 0 {
51- return 0 , errNoRemain
48+ return len ( p ), nil
5249 }
5350
5451 end := cw .remain
@@ -61,26 +58,35 @@ func (cw *cappedWriter) Write(p []byte) (int, error) {
6158 if err != nil {
6259 return written , err
6360 }
64- if written < len (p ) {
65- return written , errNoRemain
66- }
67- return written , nil
61+ return len (p ), nil
6862}
6963
7064func (cw * cappedWriter ) Close () error {
7165 return cw .w .Close ()
7266}
7367
68+ func (cw * cappedWriter ) isFull () bool {
69+ return cw .remain <= 0
70+ }
71+
7472// ExecSync executes a command in the container, and returns the stdout output.
7573// If command exits with a non-zero exit code, an error is returned.
7674func (c * criService ) ExecSync (ctx context.Context , r * runtime.ExecSyncRequest ) (* runtime.ExecSyncResponse , error ) {
7775 const maxStreamSize = 1024 * 1024 * 16
7876
7977 var stdout , stderr bytes.Buffer
78+
79+ // cappedWriter truncates the output. In that case, the size of
80+ // the ExecSyncResponse will hit the CRI plugin's gRPC response limit.
81+ // Thus the callers outside of the containerd process (e.g. Kubelet) never see
82+ // the truncated output.
83+ cout := & cappedWriter {w : cioutil .NewNopWriteCloser (& stdout ), remain : maxStreamSize }
84+ cerr := & cappedWriter {w : cioutil .NewNopWriteCloser (& stderr ), remain : maxStreamSize }
85+
8086 exitCode , err := c .execInContainer (ctx , r .GetContainerId (), execOptions {
8187 cmd : r .GetCmd (),
82- stdout : & cappedWriter { w : cioutil . NewNopWriteCloser ( & stdout ), remain : maxStreamSize } ,
83- stderr : & cappedWriter { w : cioutil . NewNopWriteCloser ( & stderr ), remain : maxStreamSize } ,
88+ stdout : cout ,
89+ stderr : cerr ,
8490 timeout : time .Duration (r .GetTimeout ()) * time .Second ,
8591 })
8692 if err != nil {
0 commit comments