Skip to content
Snippets Groups Projects
Commit 205d7878 authored by Mihnea Tudor's avatar Mihnea Tudor
Browse files

feat: clean up timeout fix and don't give point on timeout

parent 76cbba86
No related branches found
Tags v1.0.8
No related merge requests found
Pipeline #66362 passed
......@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"log/slog"
......@@ -144,16 +145,14 @@ func compareFiles(file1, file2 io.Reader) (bool, error) {
}
func runProgram(input io.Reader, output io.Writer, reference io.Reader, timeout float64) (test.Result, error) {
if timeout <= 0 {
// Set a safety timeout
timeout = 1
// Set a safety timeout
if timeout <= 0.0 {
timeout = 5.0
}
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout*float64(time.Second)))
defer cancel()
slog.Info("Running a new submission", "timeout", timeout, "duration", time.Duration(timeout*float64(time.Second)))
cmd := exec.CommandContext(timeoutCtx, "/job/src/app")
if cmd.Err != nil {
return test.NewResultError(enums.LevelSystem, "couldn't create command"), cmd.Err
......@@ -165,46 +164,12 @@ func runProgram(input io.Reader, output io.Writer, reference io.Reader, timeout
cmd.Stdout = io.MultiWriter(output, outputCopy)
cmd.Stderr = cmd.Stdout
cmdReady := make(chan error)
// ruleaza comanda in paralel
var err error
go func() {
tmpErr := cmd.Run()
err = tmpErr
cmdReady <- tmpErr
}()
timer := time.NewTimer(time.Duration(timeout * float64(time.Second)))
slog.Info("Reached select block")
select {
case <-cmdReady:
// anuleaza contextul de intrerupere
cancel()
slog.Info("Job executed successfully")
case <-timeoutCtx.Done():
err := cmd.Cancel()
if err != nil {
return test.NewResultError(enums.LevelSystem, "failed to cancel command on timeout"), err
}
return test.NewResultError(enums.LevelUser, "time limit exceeded"), err
case <-timer.C:
err := cmd.Cancel()
if err != nil {
return test.NewResultError(enums.LevelSystem, "failed to cancel command on timeout"), err
// ruleaza comanda
if err := cmd.Run(); err != nil {
if errors.Is(err, context.DeadlineExceeded) {
return test.NewResultError(enums.LevelSystem, "time limit exceeded"), err
}
return test.NewResultError(enums.LevelUser, "time limit exceeded"), err
}
if err != nil {
return test.NewResultError(enums.LevelUser, "user program did not finish successfully"), err
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment