add memory limit
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user