JOJ3/internal/executors/sandbox/executor.go

52 lines
1.1 KiB
Go

package sandbox
import (
"context"
"fmt"
"log/slog"
"focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage"
"github.com/criyle/go-judge/pb"
)
type Sandbox struct {
execClient pb.ExecutorClient
cachedMap map[string]string
}
func (e *Sandbox) Run(cmd stage.Cmd) (*stage.ExecutorResult, error) {
if cmd.CopyIn == nil {
cmd.CopyIn = make(map[string]stage.CmdFile)
}
for k, v := range cmd.CopyInCached {
if fileID, ok := e.cachedMap[v]; ok {
cmd.CopyIn[k] = stage.CmdFile{FileID: &fileID}
}
}
pbReq := &pb.Request{Cmd: convertPBCmd([]stage.Cmd{cmd})}
pbRet, err := e.execClient.Exec(context.TODO(), pbReq)
if err != nil {
return nil, err
}
if pbRet.Error != "" {
return nil, fmt.Errorf("sandbox execute error: %s", pbRet.Error)
}
executorRes := &convertPBResult(pbRet.Results)[0]
for fileName, fileID := range executorRes.FileIDs {
e.cachedMap[fileName] = fileID
}
return executorRes, nil
}
func (e *Sandbox) Cleanup() error {
for _, fileID := range e.cachedMap {
_, err := e.execClient.FileDelete(context.TODO(), &pb.FileID{
FileID: fileID,
})
if err != nil {
slog.Error("sandbox cleanup", "error", err)
}
}
return nil
}