feat: LimitedWriter: write as much as possible
This commit is contained in:
parent
c36d68eddd
commit
dd86ed8b5a
@ -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()
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user