mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
upgrade to go 1.13
This commit is contained in:
parent
9f1f7de770
commit
e0d9c13de4
@ -2,16 +2,26 @@ package file
|
|||||||
|
|
||||||
import "os"
|
import "os"
|
||||||
|
|
||||||
|
// Opener opens the file in readonly mode
|
||||||
|
// caller should close afterwards
|
||||||
|
type Opener interface {
|
||||||
|
Open() (*os.File, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contenter reads the file content
|
||||||
|
type Contenter interface {
|
||||||
|
Content() ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Namer get the file name
|
||||||
|
type Namer interface {
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
// File defines file name with its content
|
// File defines file name with its content
|
||||||
// file could on file system or memory
|
// file could on file system or memory
|
||||||
type File interface {
|
type File interface {
|
||||||
// Name get the file name
|
Opener
|
||||||
Name() string
|
Contenter
|
||||||
|
Namer
|
||||||
// Content reads the file content
|
|
||||||
Content() ([]byte, error)
|
|
||||||
|
|
||||||
// Open opens the file in readonly mode
|
|
||||||
// caller should close afterwards
|
|
||||||
Open() (*os.File, error)
|
|
||||||
}
|
}
|
||||||
|
|||||||
4
go.mod
4
go.mod
@ -1,5 +1,5 @@
|
|||||||
module github.com/criyle/go-judge
|
module github.com/criyle/go-judge
|
||||||
|
|
||||||
go 1.12
|
go 1.13
|
||||||
|
|
||||||
require github.com/criyle/go-sandbox v0.0.0-20190929004305-4001c7c7671f
|
require github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f
|
||||||
|
|||||||
8
go.sum
8
go.sum
@ -1,5 +1,5 @@
|
|||||||
github.com/criyle/go-sandbox v0.0.0-20190929004305-4001c7c7671f h1:2VJ5GhYvEEXOwIeRF2SNepXp5TQ98ZjELGIriGWQIps=
|
github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f h1:5PNJaA2V/NVR98BegmbYW2g5pHdiX3b1iXdaV/fPA9M=
|
||||||
github.com/criyle/go-sandbox v0.0.0-20190929004305-4001c7c7671f/go.mod h1:xAafqqJsAlGuL8gMgnrbNtYLmCtAWzOZQ4kM9y6/zdk=
|
github.com/criyle/go-sandbox v0.0.0-20191014070058-6e46a732897f/go.mod h1:q6ywqlRA0V2VxWo9E+dQkzK2s5mHyq2GXHtF8oZq+mI=
|
||||||
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||||
golang.org/x/sys v0.0.0-20190927073244-c990c680b611 h1:q9u40nxWT5zRClI/uU9dHCiYGottAg6Nzz4YUQyHxdA=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
|
||||||
golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|||||||
1
pkg/runner/run.go
Normal file
1
pkg/runner/run.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package runner
|
||||||
59
pkg/runner/runner.go
Normal file
59
pkg/runner/runner.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package runner
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/criyle/go-judge/file"
|
||||||
|
"github.com/criyle/go-sandbox/daemon"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Pool implements pool of daemons
|
||||||
|
type Pool interface {
|
||||||
|
Get() (*daemon.Master, error)
|
||||||
|
Put(*daemon.Master)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PipeCollector can be used in Cmd.Files paramenter
|
||||||
|
type PipeCollector struct {
|
||||||
|
Name string
|
||||||
|
SizeLimit uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pipe defines the pipe between parallel Cmd
|
||||||
|
type Pipe struct {
|
||||||
|
ReadIndex int
|
||||||
|
ReadFd int
|
||||||
|
WriteIndex int
|
||||||
|
WriteFd int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cmd defines instruction to run a program in daemon
|
||||||
|
type Cmd struct {
|
||||||
|
// argument, environment
|
||||||
|
Args []string
|
||||||
|
Env []string
|
||||||
|
|
||||||
|
// fds for exec: can be nil, file.Opener, PipeCollector
|
||||||
|
// nil: undefined, will be closed
|
||||||
|
// file.Opener: will be opened and passed to runner
|
||||||
|
// PipeCollector: a pipe write end will be passed to runner and collected as a copyout file
|
||||||
|
Files []interface{}
|
||||||
|
|
||||||
|
// cgroup limits
|
||||||
|
MemoryLimit uint64
|
||||||
|
PidLimit uint64
|
||||||
|
|
||||||
|
// file contents to copyin before exec
|
||||||
|
CopyIn map[string]file.File
|
||||||
|
|
||||||
|
// file names to copyout after exec
|
||||||
|
CopyOut []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runner defines the running instruction to run multiple
|
||||||
|
// Exec in parallel restricted within cgroup
|
||||||
|
type Runner struct {
|
||||||
|
CgroupPrefix string
|
||||||
|
Pool Pool
|
||||||
|
|
||||||
|
Cmds []Cmd
|
||||||
|
Pipes []Pipe
|
||||||
|
}
|
||||||
@ -7,14 +7,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type pool struct {
|
type pool struct {
|
||||||
builder *daemon.Builder
|
builder DaemonBuilder
|
||||||
queue chan *daemon.Master
|
queue chan *daemon.Master
|
||||||
count int32
|
count int32
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxPoolSize = 64
|
const maxPoolSize = 64
|
||||||
|
|
||||||
func newPool(builder *daemon.Builder) *pool {
|
func newPool(builder DaemonBuilder) *pool {
|
||||||
return &pool{
|
return &pool{
|
||||||
queue: make(chan *daemon.Master, maxPoolSize),
|
queue: make(chan *daemon.Master, maxPoolSize),
|
||||||
builder: builder,
|
builder: builder,
|
||||||
|
|||||||
@ -77,7 +77,7 @@ func (r *Runner) run(done <-chan struct{}, task *types.RunTask) *types.RunTaskRe
|
|||||||
// set running parameters
|
// set running parameters
|
||||||
execParam := daemon.ExecveParam{
|
execParam := daemon.ExecveParam{
|
||||||
Args: param.Args,
|
Args: param.Args,
|
||||||
Envv: env,
|
Env: env,
|
||||||
Fds: []uintptr{inputFile.Fd(), outputPipe.W.Fd(), errorPipe.W.Fd()},
|
Fds: []uintptr{inputFile.Fd(), outputPipe.W.Fd(), errorPipe.W.Fd()},
|
||||||
SyncFunc: cg.AddProc,
|
SyncFunc: cg.AddProc,
|
||||||
}
|
}
|
||||||
@ -130,10 +130,16 @@ func (r *Runner) run(done <-chan struct{}, task *types.RunTask) *types.RunTaskRe
|
|||||||
timeLimit = time.Duration(task.TimeLimit) * time.Millisecond
|
timeLimit = time.Duration(task.TimeLimit) * time.Millisecond
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wait for result
|
||||||
|
var rt stypes.Result
|
||||||
|
finish := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
defer close(finish)
|
||||||
|
rt = <-rc
|
||||||
|
}()
|
||||||
|
|
||||||
var lastCPUUsage uint64
|
var lastCPUUsage uint64
|
||||||
var totalTime time.Duration
|
var totalTime time.Duration
|
||||||
var rt stypes.Result
|
|
||||||
var rtReceived bool
|
|
||||||
lastCheckTime := time.Now()
|
lastCheckTime := time.Now()
|
||||||
|
|
||||||
// wait task finish
|
// wait task finish
|
||||||
@ -157,8 +163,7 @@ loop:
|
|||||||
lastCheckTime = now
|
lastCheckTime = now
|
||||||
lastCPUUsage = cpuUsage
|
lastCPUUsage = cpuUsage
|
||||||
|
|
||||||
case rt = <-rc: // returned
|
case <-finish: // returned
|
||||||
rtReceived = true
|
|
||||||
break loop
|
break loop
|
||||||
|
|
||||||
case <-outputPipe.Done: // outputlimit exceeded
|
case <-outputPipe.Done: // outputlimit exceeded
|
||||||
@ -171,9 +176,7 @@ loop:
|
|||||||
|
|
||||||
// get result if did not received
|
// get result if did not received
|
||||||
cancelC.cancel()
|
cancelC.cancel()
|
||||||
if !rtReceived {
|
<-finish
|
||||||
rt = <-rc
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate resource usage
|
// generate resource usage
|
||||||
cpuUsage, err := cg.CpuacctUsage()
|
cpuUsage, err := cg.CpuacctUsage()
|
||||||
|
|||||||
@ -8,13 +8,18 @@ import (
|
|||||||
"github.com/criyle/go-sandbox/daemon"
|
"github.com/criyle/go-sandbox/daemon"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// DaemonBuilder defines the abstract builder for daemon
|
||||||
|
type DaemonBuilder interface {
|
||||||
|
Build() (*daemon.Master, error)
|
||||||
|
}
|
||||||
|
|
||||||
// Runner is the task runner
|
// Runner is the task runner
|
||||||
type Runner struct {
|
type Runner struct {
|
||||||
// Queue is the message queue to receive run tasks
|
// Queue is the message queue to receive run tasks
|
||||||
Queue taskqueue.Receiver
|
Queue taskqueue.Receiver
|
||||||
|
|
||||||
// Builder builds the sandbox runner
|
// Builder builds the sandbox runner
|
||||||
Builder *daemon.Builder
|
Builder DaemonBuilder
|
||||||
|
|
||||||
Language language.Language
|
Language language.Language
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user