Internos do sistema
Este documento explica como o omegaUp processa os envios do início ao fim.
Fluxo de envio
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
Processamento de front-end
Quando uma submissão é feita:
- Código, alias do concurso, problema e idioma enviados via HTTP POST para
/api/run/create/ - Nginx encaminha para PHP (HHVM)
bootstrap.phpcarrega configuração e inicializa banco de dados- Objeto
Requestcriado com parâmetros - URL tokenizado:
/api/run/create/→['run', 'create'] RunController::apiCreate()invocado
Autenticação e Validação
O controlador:
- Valida o token de autenticação (cookie ou parâmetro POST)
- Recupera ID do usuário
- Valida permissões:
- Elementos obrigatórios presentes
- Problema pertence ao concurso
- O prazo do concurso não expirou
- Limite de taxa de envio (60 segundos por problema)
- Visibilidade do concurso (pública ou listada pelo usuário)
- Calcula a penalidade com base na política do concurso
- Gera GUID aleatório
- Armazena envio no banco de dados
- Salva o código no sistema de arquivos
- Envia solicitação HTTP para o Grader
Processamento de niveladora
Sistema de filas
O Grader mantém oito filas:
- Urgente - Concursos de alta prioridade
- Lento Urgente - Problemas urgentes, mas lentos
- Concurso - Inscrições para concursos
- Concurso Lento - Envios de concursos para problemas lentos
- Normal - Envios no modo prático
- Lento Normal - Problemas de lentidão no modo de prática
- Rejulgar - Pedidos de rejulgamento
- Rejulgamento Lento - Rejulgamento para problemas lentos
Roteamento de fila
- Envios de concursos → Fila do concurso
- Pratique envios → Fila normal
- Solicitações de rejulgamento → Fila de rejulgamento
- Problemas lentos (>30s TLE) → Filas lentas
Apenas 50% dos Runners podem processar filas lentas simultaneamente para evitar a monopolização.
Processo de Despacho
- Envio adicionado à fila apropriada
RunnerDispatcher.dispatchLocked()seleciona envio de maior prioridade- Free Runner selecionado (round-robin)
- Tempo de envio registrado
GradeTask.gradeTask()invocado no pool de threads- Prazo de 10 minutos aplicado
Processamento do corredor
Cadastro
- Os corredores se registram no Grader na inicialização
- Registre-se novamente a cada minuto para sinalizar vivacidade
- Implantado em VMs na nuvem
Compilação
Runner.compile()invocado via HTTPS- Usa
Minijailpara compilação segura - Compila o arquivo principal (e validador, se presente)
- Retorna token (caminho do sistema de arquivos) em caso de sucesso
- Exclui arquivos temporários em caso de falha
Execução
- O avaliador envia token de compilação + hash SHA-1 de entrada
- O executor verifica o cache em busca de arquivos de entrada
- Se estiver faltando, solicita o arquivo
.zipdo Grader - Executa o programa compilado em cada arquivo
.in - Armazena arquivos e metadados
.out - Compacta com bzip2
- Envia os resultados imediatamente para o Grader
- Validador executado, se presente
- Arquivos temporários excluídos
Validação e pontuação
Tipos de validadores
Todos os validadores tokenizam usando espaços:
- token: compare os tokens um por um
- token-caseless: comparação sem distinção entre maiúsculas e minúsculas
- token-numérico: Compare números com tolerância
- personalizado: validador definido pelo usuário
Pontuação
- Veredicto determinado para cada caso de teste
- Se
/testplanexistir, analise e normalize os pesos - Caso contrário, pesos iguais (1/número de casos)
- Casos agrupados por prefixo de nome de arquivo (antes do primeiro
.) - O grupo concede pontos somente se todos os casos AC ou PA
- Pontuação total = soma das pontuações do grupo × pontos do problema
- Veredicto final armazenado em banco de dados
Transmissão
A emissora:
- Mantém conexões WebSocket para participantes do concurso
- Filas
RunContextapós avaliação - Chama
/api/scoreboard/refreshpara envio de concursos - Atualiza o cache do placar
- Notifica todos os participantes sobre alterações no placar
- Registra dados de tempo e destrói
RunContext
Documentação Relacionada
- Visão geral da arquitetura - Arquitetura de alto nível
- Classificador - Detalhes do sistema do avaliador
- Runner - Detalhes do sistema do corredor