mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
99 lines
2.7 KiB
Markdown
99 lines
2.7 KiB
Markdown
# go-judge
|
|
|
|
Under designing.
|
|
|
|
The goal to to reimplement [syzoj/judge-v3](https://github.com/syzoj/judge-v3) in GO language using [go-sandbox](https://github.com/criyle/go-sandbox).
|
|
|
|
## Planned Design
|
|
|
|
### Workflow
|
|
|
|
``` text
|
|
^
|
|
|
|
|
v
|
|
+------+
|
|
|Client|
|
|
+------+
|
|
^
|
|
|
|
|
v
|
|
+------+ +----+
|
|
| |<-->|Data|
|
|
|Judger| +----+--+
|
|
| |<-->|Problem|
|
|
+------+ +-------+
|
|
^
|
|
|
|
|
v
|
|
+---------+ +--------+
|
|
|TaskQueue|<->|Language|
|
|
+---------+ +--------+
|
|
^
|
|
|
|
|
v
|
|
+--------------------+
|
|
|ContainerEnvironment|
|
|
+--------------------+
|
|
```
|
|
|
|
### Container Root Filesystem
|
|
|
|
- [x] necessary lib / exec / compiler / header readonly bind mounted from current file system: /lib /lib64 /bin /usr
|
|
- [x] work directory tmpfs mount: /w (work dir), /tmp (compiler temp files)
|
|
- [ ] additional compiler scripts / exec readonly bind mounted: /c
|
|
- [ ] additional header readonly bind mounted: /i
|
|
|
|
### Interfaces
|
|
|
|
- client: receive judge tasks (websocket / socket.io / RabbitMQ / REST API)
|
|
- data: interface to download, cache, lock and access test data files from website (by dataId)
|
|
- taskqueue: message queue to send run task and receive run task result (In memory / (RabbitMQ, Redis))
|
|
- file: general file interface (disk / memory)
|
|
- language: programming language compile & execute configurations
|
|
- problem: parse problem definition from configuration files
|
|
|
|
### Judge Logic
|
|
|
|
- judger: execute judge logics (compile / standard / interactive / answer submit) and distribute as run task to queue, the collect and calculate results
|
|
- runner: receive run task and execute in sandbox environment
|
|
|
|
### Models
|
|
|
|
- JudgeTask: judge task pushed from website (type, source, data)
|
|
- JudgeResult: judge task result send back to website
|
|
- JudgeSetting: problem setting (from yaml) and JudgeCase
|
|
- RunTask: run task parameters send to run_queue
|
|
- RunResult: run task result sent back from queue
|
|
|
|
### Utilities
|
|
|
|
- Config: read client config from TOML / YAML / JSON file
|
|
- pkg/runner: run a group of programs in parallel
|
|
|
|
## Planned API
|
|
|
|
### Progress
|
|
|
|
Client is able to report progress to the web front-end. Task should maintain its states
|
|
|
|
Planned events are:
|
|
|
|
- Parsed: problem data have been downloaded and problem configuration have been parsed (pass problem config to task)
|
|
- Compiled: user code have been compiled (success / fail)
|
|
- Progressed: single test case finished (success / fail - detail message)
|
|
- Finished: all test cases finished / compile failed
|
|
|
|
## TODO
|
|
|
|
- [x] socket.io client with namespace
|
|
- [x] judge_v3 protocol
|
|
- [ ] syzoj problem YAML config parser
|
|
- [ ] syzoj data downloader
|
|
- [ ] syzoj compile configuration
|
|
- [ ] file io
|
|
- [ ] special judger
|
|
- [ ] interact problem
|
|
- [ ] answer submit
|
|
- [ ] demo site
|