Add Prefork & no 500 when copyin

This commit is contained in:
criyle 2020-11-08 22:34:58 +00:00
parent e5c0f8ec40
commit 45fcf55ef9
3 changed files with 34 additions and 1 deletions

7
.air.toml Normal file
View File

@ -0,0 +1,7 @@
root = "."
[build]
cmd = "go build -o ./tmp/executorserver ./cmd/executorserver"
bin = "tmp/executorserver"
include_ext = ["go"]

View File

@ -17,6 +17,7 @@ import (
"github.com/criyle/go-judge/env"
"github.com/criyle/go-judge/filestore"
"github.com/criyle/go-judge/pb"
"github.com/criyle/go-judge/pkg/envexec"
"github.com/criyle/go-judge/pkg/pool"
"github.com/criyle/go-judge/worker"
ginpprof "github.com/gin-contrib/pprof"
@ -46,6 +47,7 @@ const (
envParallelism = "PARALLELISM"
envToken = "TOKEN"
envRelease = "RELEASE"
envPrefork = "PREFORK"
)
var (
@ -61,6 +63,7 @@ var (
token = flag.String("token", "", "bearer token auth for REST / gRPC")
release = flag.Bool("release", false, "use release mode for log")
srcPrefix = flag.String("srcprefix", "", "specifies directory prefix for source type copyin")
prefork = flag.Int("prefork", 0, "control # of the prefork workers")
printLog = func(v ...interface{}) {}
@ -100,6 +103,13 @@ func initEnv() (bool, error) {
if s := os.Getenv(envToken); s != "" {
token = &s
}
if s := os.Getenv(envPrefork); s != "" {
p, err := strconv.Atoi(s)
if err != nil {
return false, err
}
prefork = &p
}
if os.Getpid() == 1 || os.Getenv(envRelease) == "1" {
*release = true
}
@ -140,6 +150,20 @@ func main() {
log.Fatalln("create environment builder failed", err)
}
envPool := pool.NewPool(b)
if *prefork > 0 {
printLog("create ", *prefork, " prefork containers")
m := make([]envexec.Environment, 0, *prefork)
for i := 0; i < *prefork; i++ {
e, err := envPool.Get()
if err != nil {
log.Fatalln("prefork environment failed", err)
}
m = append(m, e)
}
for _, e := range m {
envPool.Put(e)
}
}
work = worker.New(fs, envPool, *parallelism, *dir)
work.Start()
printLog("Starting worker with parallelism=", *parallelism)

View File

@ -15,7 +15,9 @@ func runSingle(pc context.Context, m Environment, c *Cmd, fds []*os.File, ptc []
// copyin
if len(c.CopyIn) > 0 {
if err := copyIn(m, c.CopyIn); err != nil {
return result, err
result.Status = StatusInternalError
result.Error = err.Error()
return result, nil
}
}