feat(executor/local): set output on executor error

This commit is contained in:
张泊明518370910136 2025-03-20 18:22:20 -04:00
parent b6edc2c571
commit 0954bfdbd0
GPG Key ID: D47306D7062CDA9D

View File

@ -20,6 +20,7 @@ func (e *Local) generateResult(
runTime time.Duration,
cmd stage.Cmd,
stdoutBuffer, stderrBuffer bytes.Buffer,
isTimeout bool,
) stage.ExecutorResult {
result := stage.ExecutorResult{
Status: stage.StatusAccepted,
@ -65,6 +66,9 @@ func (e *Local) generateResult(
result.Error = err.Error()
}
}
if isTimeout {
result.Status = stage.StatusTimeLimitExceeded
}
if cmd.Stdout != nil && cmd.Stdout.Name != nil {
result.Files[*cmd.Stdout.Name] = stdoutBuffer.String()
@ -122,38 +126,14 @@ func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) {
done <- execCmd.Wait()
}()
if cmd.ClockLimit > 0 {
var duration time.Duration
if cmd.ClockLimit > uint64(math.MaxInt64) {
duration = time.Duration(math.MaxInt64)
} else {
duration = time.Duration(cmd.ClockLimit) * time.Nanosecond // #nosec G115
}
select {
case err := <-done:
endTime := time.Now()
runTime := endTime.Sub(startTime)
result := e.generateResult(
err,
execCmd.ProcessState,
runTime,
cmd,
stdoutBuffer,
stderrBuffer,
)
results = append(results, result)
case <-time.After(duration):
_ = execCmd.Process.Kill()
result := stage.ExecutorResult{
Status: stage.StatusTimeLimitExceeded,
Error: "",
Files: map[string]string{},
FileIDs: map[string]string{},
}
results = append(results, result)
}
var duration time.Duration
if cmd.ClockLimit > uint64(math.MaxInt64) || cmd.ClockLimit <= 0 {
duration = time.Duration(math.MaxInt64)
} else {
err := <-done
duration = time.Duration(cmd.ClockLimit) * time.Nanosecond // #nosec G115
}
select {
case err := <-done:
endTime := time.Now()
runTime := endTime.Sub(startTime)
result := e.generateResult(
@ -163,6 +143,19 @@ func (e *Local) Run(cmds []stage.Cmd) ([]stage.ExecutorResult, error) {
cmd,
stdoutBuffer,
stderrBuffer,
false,
)
results = append(results, result)
case <-time.After(duration):
_ = execCmd.Process.Kill()
result := e.generateResult(
nil,
execCmd.ProcessState,
duration,
cmd,
stdoutBuffer,
stderrBuffer,
true,
)
results = append(results, result)
}