Componentes internos del sistema
Este documento explica cómo omegaUp procesa los envíos de principio a fin.
Flujo de envío
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
Procesamiento frontal
Cuando se realiza una presentación:
- Código, alias del concurso, problema e idioma enviados mediante HTTP POST a
/api/run/create/ - Nginx reenvía a PHP (HHVM)
bootstrap.phpcarga la configuración e inicializa la base de datos.- Objeto
Requestcreado con parámetros - URL tokenizada:
/api/run/create/→['run', 'create'] - Se invoca
RunController::apiCreate()
Autenticación y validación
El controlador:
- Valida el token de autenticación (cookie o parámetro POST)
- Recupera la identificación del usuario
- Valida permisos:
- Elementos requeridos presentes
- El problema pertenece al concurso.
- El tiempo límite del concurso no ha expirado.
- Límite de tasa de envío (60 segundos por problema)
- Visibilidad del concurso (público o usuario listado)
- Calcula la penalización según la política del concurso.
- Genera GUID aleatorio
- Almacena el envío en la base de datos.
- Guarda el código en el sistema de archivos.
- Envía una solicitud HTTP a Grader
Procesamiento del calificador
Sistema de cola
The Grader mantiene ocho colas:
- Urgente - Concursos de alta prioridad
- Lento Urgente - Problemas urgentes pero lentos
- Concurso - Envíos al concurso
- Concurso lento: presentaciones de concursos para problemas lentos
- Normal - Envíos en modo práctica
- Lento Normal - Problemas lentos en el modo de práctica
- Rejuzgar - Rejuzgar solicitudes
- Rejuicio lento - Rejuicio para problemas lentos
Enrutamiento de cola
- Envíos al concurso → Cola del concurso
- Envíos de práctica → Cola normal
- Solicitudes de rechazo → Cola de rechazo
- Problemas lentos (>30s TLE) → Colas lentas
Solo el 50% de los corredores pueden procesar colas lentas simultáneamente para evitar la monopolización.
Proceso de envío
- Envío agregado a la cola correspondiente
RunnerDispatcher.dispatchLocked()selecciona el envío de mayor prioridad- Free Runner seleccionado (todos contra todos)
- Hora de envío registrada
GradeTask.gradeTask()invocado en el grupo de subprocesos- Se aplica un plazo de 10 minutos
Procesamiento del corredor
Registro
- Los corredores se registran con Grader al inicio.
- Vuelva a registrarse cada minuto para indicar que está vivo.
- Implementado en máquinas virtuales en la nube
Compilación
Runner.compile()invocado a través de HTTPS- Utiliza
Minijailpara una compilación segura - Compila el archivo principal (y el validador si está presente)
- Devuelve el token (ruta del sistema de archivos) en caso de éxito.
- Elimina archivos temporales en caso de falla.
Ejecución
- Grader envía token de compilación + hash SHA-1 de entrada
- Runner comprueba el caché en busca de archivos de entrada.
- Si falta, solicita el archivo
.zipde Grader - Ejecuta el programa compilado en cada archivo
.in. - Almacena archivos y metadatos
.out - Comprime con bzip2
- Envía los resultados inmediatamente a Grader
- Ejecución del validador si está presente
- Archivos temporales eliminados
Validación y puntuación
Tipos de validador
Todos los validadores tokenizan usando espacios:
- token: compara tokens uno por uno
- token-caseless: comparación que no distingue entre mayúsculas y minúsculas
- token-numeric: Compara números con tolerancia
- personalizado: validador definido por el usuario
Puntuación
- Veredicto determinado para cada caso de prueba.
- Si existe
/testplan, analice y normalice los pesos. - En caso contrario, pesos iguales (1/número de casos)
- Casos agrupados por prefijo de nombre de archivo (antes del primer
.) - El grupo otorga puntos solo si todos los casos son AC o PA.
- Puntuación total = suma de puntuaciones del grupo × puntos del problema
- Veredicto final almacenado en la base de datos.
Radiodifusión
La emisora:
- Mantiene conexiones WebSocket para los participantes del concurso.
- Colas
RunContextdespués de la evaluación - Llama a
/api/scoreboard/refreshpara presentaciones de concursos. - Actualiza la caché del marcador
- Notifica a todos los participantes sobre los cambios en el marcador.
- Registra datos de sincronización y destruye
RunContext
Documentación relacionada
- Descripción general de la arquitectura - Arquitectura de alto nivel
- Grader - Detalles del sistema de calificación
- Runner - Detalles del sistema Runner