feat: LimitedWriter: write as much as possible

This commit is contained in:
Paul Pan 2024-01-07 00:26:18 +08:00
parent c36d68eddd
commit dd86ed8b5a
Signed by: Paul
GPG Key ID: D639BDF5BA578AF4
2 changed files with 20 additions and 5 deletions

View File

@ -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()
}

View File

@ -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)
}