add memory limit

This commit is contained in:
2026-04-10 18:45:40 +03:00
parent 86b8d83643
commit a977d4d9f5
13 changed files with 662 additions and 37 deletions

View File

@@ -225,6 +225,9 @@ func (r *Runner) runGroup(g *dsl.Group) *GroupResult {
if t.Timeout == 0 {
t.Timeout = g.Timeout
}
if t.MemoryLimit == 0 {
t.MemoryLimit = g.MemoryLimit
}
if t.Wrapper == "" {
t.Wrapper = g.Wrapper
}
@@ -313,10 +316,34 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult {
cmd.Stdout = stdout
cmd.Stderr = stderr
tr.MemoryLimit = t.MemoryLimit
lim := newLimiter(t.MemoryLimit)
if err := lim.prepare(cmd); err != nil {
tr.Status = StatusRuntimeError
tr.addFailure("memory limiter setup: %v", err)
return tr
}
defer lim.cleanup()
start := time.Now()
runErr := cmd.Run()
if err := cmd.Start(); err != nil {
tr.Status = StatusRuntimeError
tr.addFailure("start: %v", err)
return tr
}
if err := lim.afterStart(cmd); err != nil {
killProcessGroup(cmd)
_ = cmd.Wait()
tr.Status = StatusRuntimeError
tr.addFailure("memory limiter attach: %v", err)
return tr
}
runErr := cmd.Wait()
tr.Elapsed = time.Since(start)
stats := lim.collect()
tr.PeakMemory = stats.PeakMemory
if ctx.Err() == context.DeadlineExceeded {
killProcessGroup(cmd)
}
@@ -334,6 +361,12 @@ func (r *Runner) runTest(t *dsl.Test) *TestResult {
return tr
}
if stats.MemoryExceeded {
tr.Status = StatusMLE
tr.addFailure("memory limit exceeded (limit %d bytes, peak %d bytes)", t.MemoryLimit, stats.PeakMemory)
return tr
}
actualCode := 0
if runErr != nil {
if exitErr, ok := runErr.(*exec.ExitError); ok {