diff --git a/internal/service/runner/exec.go b/internal/service/runner/exec.go index 58e5bb8..79dd522 100644 --- a/internal/service/runner/exec.go +++ b/internal/service/runner/exec.go @@ -6,6 +6,7 @@ import ( "fmt" "git.0x7f.app/WOJ/woj-server/pkg/file" "git.0x7f.app/WOJ/woj-server/pkg/utils" + "go.uber.org/zap" "os" "os/exec" "time" @@ -88,6 +89,7 @@ func (s *service) podmanRun(arg *podmanArgs) error { limit: utils.If(arg.limit == 0, 4*1024, arg.limit), timeout: utils.If(arg.timeout == 0, 10*time.Second, arg.timeout), kill: func() error { + s.log.Warn("[podman] timeout killer", zap.String("name", name)) if arg.kill != nil { _ = arg.kill() } diff --git a/pkg/file/writer.go b/pkg/file/writer.go index 797661a..ceaebd0 100644 --- a/pkg/file/writer.go +++ b/pkg/file/writer.go @@ -2,6 +2,7 @@ package file import ( "fmt" + "git.0x7f.app/WOJ/woj-server/pkg/utils" "os" ) @@ -11,11 +12,23 @@ type LimitedWriter struct { n int64 } -func (lw *LimitedWriter) Write(p []byte) (n int, err error) { - if lw.n+int64(len(p)) > lw.Limit { - return 0, fmt.Errorf("output limit exceeded") +func (lw *LimitedWriter) Write(p []byte) (int, error) { + remaining := lw.Limit - lw.n + if remaining <= 0 { + return 0, fmt.Errorf("write limit exceeded") } - n, err = lw.File.Write(p) + + var err, err2 error + var n int + + writeLen := int64(len(p)) + if writeLen > remaining { + err = fmt.Errorf("write limit exceeded") + writeLen = remaining + } + + n, err2 = lw.File.Write(p[:writeLen]) lw.n += int64(n) - return + + return n, utils.If(err2 != nil, err2, err) }