Изменения в версии 3.8.0

From EjudgeWiki
Revision as of 20:33, 1 February 2020 by Cher (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Навигация: Главная страница/Система ejudge/Разработка/История версий/Изменения в версии 3.8.0

Время выхода: 1 февраля 2020 г.

Предыдущая версия

Contents

Общие изменения

ejudge компилируется с опцией -std=gnu11 вместо -std=gnu99. Эта же опция используется при динамической компиляции HTML-страниц во время работы ejudge.

Исходные файлы (.c) перенесены из корневого каталога проекта в несколько подкаталогов (bin, lib) в зависимости от их назначения.

Переработана схема размещения рабочих файлов при работе ejudge. Цель переработки - сделать возможным подключение каталога CONTESTS_DIR (например, /home/judges) в режиме read-only на сервера компиляции и исполнения программ. Для этого из каталога турнира убраны каталоги, в которых записываются пакеты с результатом компиляции и исполнения программы. Из каталога турнира убран каталог, содержащий текущее состояние турнира и, в частности, генерируемый HTML-файл c текущими результатами.

Поддерживается гибкая схема, в котором несколько разных серверов турнира могут отправить запрос на компиляцию на один сервер компиляции, и ответ от сервера компиляции придет соответствующему серверу турнира. Аналогично обрабатываются запросы на тестирование. Каждый сервер турниров имеет свой идентификатор CONTEST_SERVER_ID, сервер компиляции имеет идентификатор, который обозначим COMPILE_SERVER_ID, и сервер тестирования - идентификатор RUN_SERVER_ID. В базовой конфигурации все идентификаторы одинаковы и равны имени хоста, на котором запущен ejudge.

Новая схема обмена запросами с сервером компиляции

Для активации новой схемы размещения файлов потребуется задать специальные опции при выполнении скрипта configure.

--enable-compile-spool-dir[=COMPILE_SPOOL_DIR]

Эта опция включает новое размещение файлов для взаимодействия программы компиляции ej-compile и сервера турниров ej-contests. Опциональный параметр COMPILE_SPOOL_DIR позволяет задать путь к каталогу обмена. Если параметр не указан, то COMPILE_SPOOL_DIR будет установлен в каталог CONTESTS_HOME_DIR/../ej-compile-spool.

Например, если configure выполяется с параметрами:

./configure --enable-compile-spool-dir

то есть не указан --enable-contests-home-dir и не указан параметр у --enable-compile-spool-dir, то путь к каталогу турниров будет /home/judges, а путь к каталогу обмена с ej-compile будет /home/ej-compile-spool.

Если configure выполяется с параметрами:

./configure --enable-contests-home-dir=/home/ejudge/judges --enable-compile-spool-dir

то путь к каталогу обмена с ej-compile будет установлен в /home/ejudge/ej-compile-spool.

Каталог обмена имеет следующую структуру:

Файл с программой, которую необходимо скомпилировать, помещается в каталог COMPILE_SPOOL_DIR/COMPILE_SERVER_ID/src. Запрос на компиляцию (файл, содержащий параметры компиляции и другие настройки) помещается в каталог COMPILE_SPOOL_DIR/COMPILE_SERVER_ID/queue/dir. Сервер компиляции ej-compile забирает запрос на обработку и удаляет соответствующие файлы.

Результат компиляции помещается в каталог COMPILE_SPOOL_DIR/CONTEST_SERVER_ID/CONTEST_ID. В подкаталог report будет помещен файл {TESTING_ID}{EXE_SFX}, содержащий файл, полученный в результате компиляции, в этот же подкаталог будет помещен файл {TESTING_ID}.txt с предупреждениями компилятора, точнее, со всем выводом компилятора и/или программы проверки стиля на стандартный поток ошибок. В подкаталог status/dir будет помещен файл {TESTING_ID} с информацией о результате компиляции.

Например, пусть COMPILE_SPOOL_DIR установлен в /home/ej-compile-spool. Идентификатор сервера турнира - server1. Идентификатор (номер) турнира - 211. Сервер турнира назначил запросу на компиляцию идентификатор ae42f343. Идентификатор сервера компиляции - server2. Предположим, что компилируется программа на языке C++, то есть исходный файл имеет суффикс .cpp. Тогда исходный текст компилируемой программы будет помещен в файл с путем /home/ej-compile-spool/server2/src/ae42f343.cpp, а параметры компиляции в файл /home/ej-compile-spool/server2/queue/dir/ae42f343.

Результат компиляции (исполняемый файл) будет размещен по пути /home/ej-compile-spool/server1/000211/report/ae42f343. Суффикс отсутствует, так как у обычных исполняемых файлов linux нет суффикса. Файл с предупреждениями/ошибками компиляции будет размещен по пути /home/ej-compile-spool/server1/000211/report/ae42f343.txt, а файл с информацией о результате компиляции будет размещен по пути /home/ej-compile-spool/server1/000211/status/dir/ae42f343.

Новая схема обмена запросами с сервером тестирования

Для активации новой схемы размещения файлов потребуется задать специальные опции при выполнении скрипта configure.

--enable-run-spool-dir[=RUN_SPOOL_DIR]

Эта опция включает новое размещение файлов для взаимодействия программы тестирования ej-super-run и сервера турниров ej-contests. Опциональный параметр RUN_SPOOL_DIR позволяет задать путь к каталогу обмена. Если параметр не указан, то RUN_SPOOL_DIR будет установлен в каталог CONTESTS_HOME_DIR/../ej-run-spool.

Например, если configure выполяется с параметрами:

./configure --enable-run-spool-dir

то есть не указан --enable-contests-home-dir и не указан параметр у --enable-run-spool-dir, то путь к каталогу турниров будет /home/judges, а путь к каталогу обмена с ej-super-run будет /home/ej-run-spool.

Если configure выполяется с параметрами:

./configure --enable-contests-home-dir=/home/ejudge/judges --enable-run-spool-dir

то путь к каталогу обмена с ej-super-run будет установлен в /home/ejudge/ej-run-spool.

Каталог обмена имеет следующую структуру:

Файл с программой на тестирование помещается в каталог RUN_SPOOL_DIR/RUN_SERVER_ID/exe. Запрос с параметрами тестирования (файл, содержащий параметры тестирования и другие настройки) помещается в каталог RUN_SPOOL_DIR/RUN_SERVER_ID/queue/dir. Сервер тестирования ej-super-run забирает запрос на обработку и удаляет соответствующие файлы.

Результат тестирования помещается в каталог RUN_SPOOL_DIR/CONTEST_SERVER_ID/CONTEST_ID. В подкаталог report будет помещен файл {TESTING_ID} содержащий файл с протоколом тестирования. В подкаталог status/dir будет помещен файл {TESTING_ID} с информацией о результатах тестирования.

Например, пусть RUN_SPOOL_DIR установлен в /home/ej-run-spool. Идентификатор сервера турнира - server1. Идентификатор (номер) турнира - 211. Сервер турнира назначил запросу на тестирование идентификатор ae42f343. Идентификатор сервера тестирования - server3. Предположим, что тестируется программа на языке C++, то есть исполняемый файл не имеет суффикса. Тогда исполняемый файл для тестирования будет помещен в файл с путем /home/ej-run-spool/server3/exe/ae42f343, а параметры тестирования в файл /home/ej-run-spool/server3/queue/dir/ae42f343.

Результат тестирования (протокол тестирования) будет помещен в файле с путем /home/ej-run-spool/server1/000211/report/ae42f343. Файл с информацией о результате тестирования будет размещен в файле /home/ej-run-spool/server1/000211/status/dir/ae42f343.

Новая схема хранения файлов состояния турнира

Для активации новой схемы хранения файлов состояния турнира используется опция configure:

./configure --enable-contests-status-dir

В этом режиме файлы состояния турнира, в том числе файл с текущим положением участника, переносится из каталога турнира в каталог локального состояния всей системы ejudge. Например, если использовались опции

./configure --enable-local-dir=/var/lib/ejudge --enable-contests-status-dir

в этом случае файлы состояния турнира будут размещаться в каталоге /var/lib/ejudge/status/CONTEST_ID/dir/ Например, файл с текущим положением участников будет находится по пути /var/lib/ejudge/status/CONTEST_ID/dir/standings.html

Обратите внимание, что может быть включен режим хранения состояния турнира в базе mongo.

Поддержка mongodb

В предыдущих версиях ejudge для подключения к mongo использовалась библиотека libmongo-client. К сожалению, эта библиотека устарела и не поддерживает новых возможностей mongodb, в частности, новых режимов аутентификации. В следующих версиях ejudge поддержка libmongo-client, скорее всего, будет удалена.

"Официальная" клиентская библиотека для mongodb называется libmongoc. Однако libmongoc для mongodb версии 4 (libmongoc >= 1.13) несовместима с libmongoc предыдущих версий из-за изменения расположения заголовочных файлов.

При выполнении configure автоматически определяется наличие библиотеки для mongo-клиента. Предпочтение отдается libmongoc версии >= 1.13, затем libmongoc более старых версий, затем libmongo-client. Запретить использование libmongoc можно с помощью с помощью --enable-libmongoc=disable.

Кроме того, если в системе обнаружена библиотека libmongoc, протокол тестирования будет храниться в формате BSON вместо XML (см. далее).

Эта версия ejudge поддерживает хранение в mongodb следующих данных:

  • автары пользователей (плагин avatar_mongo);
  • статус турнира (status_mongo);
  • статус участия пользователя в турнире (xuser_mongo).

Кроме того, плагин для telegram хранит свои данные в mongodb.

Начиная с этой версии поддерживается аутентификация при подключении к mongo.

Языки программирования

Добавлена поддержка платформы dotnet (https://dotnet.microsoft.com). Компилятор языка C# называется dotnet-cs, компилятор Visual Basic .NET - dotnet-vb. Для этих языков не поддерживаются ограничения безопасности. При запуске программ в среде dotnet ограничение памяти и стека накладывается на запускаемый интерпретатор целиком, поэтому для запуска dotnet программ может потребоваться установить отдельные лимиты на размер адресного пространства:

[language]
id = 73
short_name = "dotnet-cs"
long_name = ".NET C# compiler 3.0.100"
src_sfx = ".cs"
insecure
arch = "dotnet"
exe_sfx = ".dll"
run_max_stack_size = 8M  # уменьшаем размер системного стека до минимального
run_max_vm_size = 4G     # ограничение на максимальный размер адресного пространства

Для языков mcs и vbnc, базирующихся на платформе mono, убрана специальная обработка ограничений памяти и политик безопасности. Они рассматриваются как обычные интерпретаторы, то есть лимит адресного пространства и стека накладывается на запускаемый интерпретатор.

Поддерживаются версии javac 11, 12, 13, 14.

Для запуска интерпретатора python2 используется команда python2 вместо python, так как во многих современных системах команда python запускает интерпретатор языка python3.

configure

Поддерживаются опции --enable-compile-spool-dir, --enable-run-spool-dir, --enable-contests-status-dir, --enable-libmongoc.

Инсталляция

Для установки необходимых прав на исполняемые файлы, исполняющиеся с повышенными привилегиями, реализована программа ejudge-suid-setup. Если при конфигурировании ejudge были заданы опции --with-exec-user или --with-compile-user, то после выполнения команды make install необходимо будет запустить команду ejudge-suid-setup под пользователем root. Эта программа установит необходимые права на привилегированные исполняемые файлы.

ejudge.xml

Добавлены новые элементы:

  • contests_ws_port - позволяет указать номер порта для ej-contests для обработки запросов по протоколу ws (web socket)
  • default_status_plugin - позволяет указать плагин для хранения состояния турнира, который будет использоваться по умолчанию
  • max_loaded_contests - позволяет указать максимальное количество одновременно загруженных в памяти турниров

contest.xml

У элемента field добавлен атрибут is_password. Если значение атрибута установлено в true, это поле ввода будет вести себя как пароль, то есть не отображать введенный текст.

.inf-файлы

Добавлены новые параметры файлов настроек тестирования:

time_limit_ms

Позволяет задать ограничение времени в миллисекундах для данного теста

real_time_limit_ms

Позволяет задать ограничение реального времени в миллисекундах для данного теста

program_name

Позволяет задать имя запускаемой программы, которое будет в нее передаваться, то есть значение argv[0]

ej-compile

Поддерживается переменная окружения EJ_COMPILE_SERVER_ID, которая позволяет установить идентификатор сервера компиляции (см. выше).

Поддерживается опция командной строки -i COMPILE-SERVER_ID, которая позволяет установить идентификатор сервера компиляции.

Поддерживается новая схема обмена запросами с сервером турнира (см. выше).

ej-contests

Поддерживается установка идентификатора сервер тураниров (CONTEST_SERVER_ID - см. выше). Его можно задать в конфигурационном файле ejudge.xml в элементе <contest_server_id>. Если он не задан в конфигурационном файле, проверяется переменная окружения EJ_CONTEST_SERVER_ID. Если она не установлена, то берется имя хоста, на котором запущена программа ej-contests. Если же и имя хоста не установлено, используется имя localhost.

Частичная загрузка посылок

Поддерживается неполная загрузка посылок в память при загрузке турнира. Например, можно подгрузить не все посылки из базы данных, а только последние 1000. Для этого нужно установить параметр window плагина rldb_mysql в файле ejudge.xml следующим образом:

    <plugin type="rldb" name="mysql" load="yes">
      <config>
        <window>1000</window>
      </config>
    </plugin>

Однако фильтрация, перепроверка и прочие операции над посылками будут выполняться только для загруженной в память части всех посылок.

Хранение протоколов в формате BSON

Если при компиляции ejudge была обнаружена библиотека libbson, то протокол тестирования будет храниться не в формате XML, а в формате BSON. Это облегчит перенос и последующее хранение протоколов тестирования в mongodb. При хранении протокола в формате BSON он хранится в файле breport (вместо report) и никогда не сжимается с помощью gzip. Поле store_flags записи в базе посылок будет равно 2 (STORE_FLAGS_UUID_BSON). Эта функциональность поддерживается только если у турнира установлен флаг uuid_run_store.

Хранение состояния турнира в mongodb

Поддерживается хранение текущего состояния турнира, то есть различных флагов его работы, различных настроек, сделанных во время работы турнира, в базе mongodb. По умолчанию текущее состояние турнира хранится в файле status, расположенном там же, где файл текущего положения участников. Чтобы активировать хранение текущего состояния турнира в mongodb необходимо в конфигурационном файле ejudge.xml разрешить загрузку плагина:

    <plugin type="status" name="mongo" load="yes">
      <config/>
    </plugin>

Далее можно активировать хранение состояния для всех турниров по умолчанию, добавив в файл ejudge.xml элемент

<default_status_plugin>mongo</default_status_plugin>

Или же для каждого турнира прописать в файле serve.cfg глобальный параметр status_plugin

status_plugin = "mongo"

Хранение уникального uuid задачи в базе данных посылок

В базу посылок добавлено поле prob_uuid. В этом поле хранится uuid задачи, если он установлен. Данное поле пока используется только для записи. При выборке посылок из базы и загрузке их в память поле prob_uuid в память не загружается. Назначение этого поля в том, чтобы можно было идентифицировать одну и ту же задачу, когда она используется в нескольких турнирах.

API для доступа к турниру

Начата реализация API для доступа к турниру непривилегированных пользователей. В ответ на API-запрос возвращаются данные в формате json. В текущей версии реализованы следующие запросы:

  • login
  • user-contests
  • enter-contest
  • contest-status
  • problem-status
  • problem-statement
  • list-runs
  • run-status
  • run-messages
  • run-test
  • contest-info
  • session-info

Ограничение максимального количества турниров в памяти

Поддерживается ограничение на максимальное количество одновременно находящихся в памяти турниров. Если при загрузке очередного турнира это ограничение превышается, турнир, обращений к которому не было дольше всего, выгружается. Ограничение можно установить, задав в конфигурационном файле ejudge.xml элемент max_loaded_contests, например:

<max_loaded_contests>10</max_loaded_contests>

Новые глобальные конфигурационные переменные в serve.cfg

Добавлена глобальная конфигурационная переменная status_plugin. Она позволяет задать имя плагина для хранения текущего состояния турнира.

status_plugin = "mongo"

Добавлена глобальная конфигурационная переменная require_problem_uuid. Если она установлена в положительное значение, при сдаче любой задачи на проверку требуется, чтобы для этой задачи был задан uuid, который будет сохранен в базу данных. Если для задачи не задан uuid, при попытке сдачи ее на проверку будет выдана ошибка.

Добавлена глобальная конфигурационная переменная enable_problem_history. Если она установлена в положительное значение, то значение uuid для задачи будет загружаться из файла history.txt, который должен находиться в каталоге задачи.

Новые конфигурационные переменные задачи в serve.cfg

Добавлена конфигурационная переменная задачи uuid. Она позволяет задавать uuid задачи, который сохраняется в базе данных при сдаче программы на проверку по этой задаче.

Добавлена конфигурационная переменная задачи stop_on_first_fail. Если она установлена в положительное значение, в турнирах типа KIROV тестирование решений будет превываться первым непрошедшим тестом. Все оставшиеся тесты получат статус skipped.

Добавлена конфигурационная переменная задачи enable_kill_all. Если она установлена в положительное значение, при снятии тестируемой программы с выполнения будут сниматься с выполнения все процессы пользователя ejexec. Данная опция несовместима с тестированием в несколько потоков. Опция активна только когда тестирование ведется под отдельным пользователем.

Добавлена конфигурационная переменная задачи enable_extended_info. Если она установлена в положительное значение, программам, которые поддерживают тестирование решений, то есть оценивающей программе, программе проверки ответа и т. п. в переменных окружения передается дополнительная информация о тестируемом решении. Передаются следующие переменные окружения:

  • EJUDGE_USER_ID - идентификатор пользователя, сдавшего тестируемое решение
  • EJUDGE_CONTEST_ID - идентификатор турнира
  • EJUDGE_RUN_ID - номер посылки
  • EJUDGE_TEST_NUM - номер теста
  • EJUDGE_USER_LOGIN - регистрационное имя пользователя
  • EJUDGE_USER_NAME - имя пользователя

Конфигурационные переменные задачи compile_error_penalty, run_penalty могут принимать отрицательные значения меньше -1. При отрицательных штрафах ошибка компиляции или ошибка при тестировании задачи будут увеличивать балл задачу.

В конфигурационной переменной задачи lang_compiler_env поддерживается выражение "*=", которое позволяет задать настройки, применимые к любому языку программирования. Например,

lang_environ = "*=-Wall -O2 -DSECRET_VALUE=42"

Новые конфигурационные переменные языкового процессора в serve.cfg

Добавлена конфигурационная переменная языкового процессора compile_server_id. Эта переменная позволяет задавать сервер компиляции, который будет выполнять компиляцию решений на данном языке программирования.

Добавлена конфигурационная переменная языкового процессора run_max_vm_size. Эта переменная позволяет переопределить лимит адресного пространства при тестировании решений, написанных на данном языке программирования. Она полезна в случаях, когда "обычное" ограничение размера виртуального адресного пространства, устновленное в задаче, не позволяет выполнить программу на данном языке программирования.

Добавлена конфигурационная переменная языкового процессора multi_header_suffix. Она позволять задать суффикс для файлов, используемых при компиляции решений в режиме enable_multi_header, то есть при потестовой компиляции. Например, если multi_header_suffix для некоторого языка программирования установлен в

multi_header_suffix = ".aarch64"

то, например, файл с параметрами компиляции будет называться 001.inf.aarch64

Форматное преобразование %Lm выполняет подстановку в указанную форматную строку параметра multi_header_suffix.

Изменения в интерфейсе участника турнира

Участнику турнира в строке состояния турнира отображается, сколько раз он был вызван на защиту своего решения, то есть сколько его посылок имеют статус "Summoned for defence".

На странице просмотра протокола тестирования участника турнира добавлена ссылка "Resubmit run". По этой ссылке происходит переход на страницу сдачи этой задачи, при этом автоматически выделяется тот же самый язык программирования, который был использован при сдаче текущей посылки.

На странице просмотра исходного кода участника турнира добавлена ссылка "Resubmit run". По этой ссылке происходит переход на страницу сдачи этой задачи, при этом автоматически выделяется тот же самый язык программирования, который был использован при сдаче текущей посылки.

Если задача находится в состоянии "submittable", то есть ее можно сдавать, то все задачи, для которых автоматически проставляется ok при сдаче этой задачи, становятся несдаваемыми. То есть, если у некоторой задачи A установлено свойство

provide_ok = "B"

и задача A доступна для сдачи, то задача B будет помечена как недоступная для сдачи.

Для задач на написание тестов в протоколе тестирования отображаются ошибки валидации сданного архива с тестами.

Изменения в интерфейсе привилегированного пользователя

На странице диалога download runs параметр problem_dir_prefix сохраняется между сессиями.

На страницу просмотра исходного кода привилегированных пользователей добавлена ссылка "Resubmit run".

При посылке решения от привилегированного пользователя доступны только разрешенные языки программирования для данной задачи.

Исправлены ссылки управления посылками на странице "Testing queue".

На странице просмотра информации о пользователе добавлена ссылка "Impersonate user". По этой ссылке просиходит переход на страницу участника турнира с правами этого участника.

В интерфейс администратора и судьи добавлена функция "Lock filter". При нажатии на эту кнопку текущее выражение фильтра заменяется на выражение, в которое входят только идентификаторы текущих отображаемых посылок. Например, если текущее выражение фильтра равно

status == CF

и отображаются посылки 100 и 200, то выражение фильтра будет заменено на

id==100||id==200

Эта функция может оказаться удобной в случае, когда необходимо перетестировать посылки и отследить, как изменился результат перетестирования.

Добавлена страница статистики по задачам. Пока содержит базовую информацию о задачах.

Проверяется ограничение на максимальный размер сообщения при отсылке от жюри.

ej-jobs

Лог-файлы перенесены в var_dir.

ej-polygon

Обновления в соответствии с изменениями на сайте polygon.codeforces.com.

Реализовано использование polygon API для скачивания турниров и задач. К сожалению, невозможно скачать пакет для linux, поэтому активизация режима API отложено.

В конфигурационный файл добавлены параметры 'key' и 'secret' для использования в polygon API.

ej-suid-ipcrm

Улучшено уничтожение объектов IPC.

ej-super-run

Поддерживается опция командной строки -d, которая позволяет установить идентификатор сервера тестирования (RUN_SERVER_ID).

Поддерживается переменная окружения EJ_RUN_SERVER_ID для установки идентификатора сервера тестирования.

Добавлена поддержка для архитектуры "dotnet" для Microsoft .NET core ([dotnet.microsoft.com]).

Если установлен параметр enable_extended_info при запуске интерактора, чекера и прочих программ устанавливаются переменные окружения EJUDGE_USER_ID, EJUDGE_CONTEST_ID, EJUDGE_RUN_ID, EJUDGE_TEST_NUM, EJUDGE_USER_LOGIN, EJUDGE_USER_NAME (см. выше).

Новые глобальные параметры пакета тестирования:

  • contest_server_id
  • separate_run_spool_mode
  • bson_available

Новые параметры тестирования задачи:

  • enable_kill_all
  • uuid
  • enable_extended_info
  • stop_on_first_fail

Поддерживается сжатие данных в формате bzip2.

ej-super-server

На главную страницу в список турниров добавлено отображение доступности турнира: O - турнир открыт (зеленый) или закрыт (красный), V - турнир видимый (зеленый) или невидимый (красный), программа register доступна со всех IP (зеленый), с некоторых IP (желтый) или недоступна, программа users доступна со всех IP (зеленый), с некоторых IP (желтый) или недоступна, программа client (участие в турнире) доступна со всех IP (зеленый), с некоторых IP (желтый) или недоступна.

ejudge-suid-setup

Новая программа. Она устанавливает необходимые права доступа на привилегированные программы в случае компиляции или исполнения под отдельными пользователями.

ej-users

Поддерживаются новые запросы CHECK_USER_2, CREATE_COOKIE.