upgrade to go 1.13

This commit is contained in:
criyle 2019-10-14 00:34:48 -07:00
parent 9f1f7de770
commit e0d9c13de4
8 changed files with 104 additions and 26 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -0,0 +1 @@
package runner

59
pkg/runner/runner.go Normal file
View 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
}

View File

@ -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,

View File

@ -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()

View File

@ -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