System Internals
This document explains how omegaUp processes submissions from start to finish.
Submission Flow
sequenceDiagram
participant User
participant Frontend
participant Controller
participant Grader
participant Runner
participant Database
User->>Frontend: Submit code
Frontend->>Controller: POST /api/run/create/
Controller->>Controller: Validate request
Controller->>Database: Store submission
Controller->>Grader: Send for evaluation
Grader->>Grader: Queue submission
Grader->>Runner: Dispatch to Runner
Runner->>Runner: Compile code
Runner->>Runner: Execute against test cases
Runner->>Grader: Return results
Grader->>Database: Store verdict
Grader->>Frontend: Broadcast via WebSocket
Frontend->>User: Display result
Frontend Processing
When a submission is made:
- Code, contest alias, problem, and language sent via HTTP POST to
/api/run/create/ - Nginx forwards to PHP (HHVM)
bootstrap.phploads configuration and initializes databaseRequestobject created with parameters- URL tokenized:
/api/run/create/→['run', 'create'] RunController::apiCreate()invoked
Authentication & Validation
The controller:
- Validates authentication token (cookie or POST parameter)
- Retrieves user ID
- Validates permissions:
- Required elements present
- Problem belongs to contest
- Contest time limit not expired
- Submission rate limit (60 seconds per problem)
- Contest visibility (public or user listed)
- Calculates penalty based on contest policy
- Generates random GUID
- Stores submission in database
- Saves code to filesystem
- Sends HTTP request to Grader
Grader Processing
Queue System
The Grader maintains eight queues:
- Urgent - High-priority contests
- Slow Urgent - Urgent but slow problems
- Contest - Contest submissions
- Slow Contest - Contest submissions for slow problems
- Normal - Practice mode submissions
- Slow Normal - Practice mode slow problems
- Rejudge - Rejudge requests
- Slow Rejudge - Rejudge for slow problems
Queue Routing
- Contest submissions → Contest queue
- Practice submissions → Normal queue
- Rejudge requests → Rejudge queue
- Slow problems (>30s TLE) → Slow queues
Only 50% of Runners can process slow queues simultaneously to prevent monopolization.
Dispatch Process
- Submission added to appropriate queue
RunnerDispatcher.dispatchLocked()selects highest-priority submission- Free Runner selected (round-robin)
- Dispatch time logged
GradeTask.gradeTask()invoked in thread pool- 10-minute deadline enforced
Runner Processing
Registration
- Runners register with Grader on startup
- Re-register every minute to signal liveness
- Deployed on cloud VMs
Compilation
Runner.compile()invoked via HTTPS- Uses
Minijailfor secure compilation - Compiles main file (and validator if present)
- Returns token (filesystem path) on success
- Deletes temporary files on failure
Execution
- Grader sends compilation token + input SHA-1 hash
- Runner checks cache for input files
- If missing, requests
.zipfile from Grader - Executes compiled program against each
.infile - Stores
.outfiles and metadata - Compresses with bzip2
- Sends results immediately to Grader
- Validator run if present
- Temporary files deleted
Validation & Scoring
Validator Types
All validators tokenize using spaces:
- token: Compare tokens one by one
- token-caseless: Case-insensitive comparison
- token-numeric: Compare numbers with tolerance
- custom: User-defined validator
Scoring
- Verdict determined for each test case
- If
/testplanexists, parse and normalize weights - Otherwise, equal weights (1/number of cases)
- Cases grouped by filename prefix (before first
.) - Group grants points only if all cases AC or PA
- Total score = sum of group scores × problem points
- Final verdict stored in database
Broadcasting
The Broadcaster:
- Maintains WebSocket connections for contest participants
- Queues
RunContextafter evaluation - Calls
/api/scoreboard/refreshfor contest submissions - Updates scoreboard cache
- Notifies all participants of scoreboard changes
- Records timing data and destroys
RunContext
Related Documentation
- Architecture Overview - High-level architecture
- Grader - Grader system details
- Runner - Runner system details