chore(judge): document explicit managed runtime rollout

This commit is contained in:
2026-10-09 23:29:23 +08:00
parent d20721313e
commit 67c3bc55ba
8 changed files with 437 additions and 3 deletions
+34
View File
@@ -106,3 +106,37 @@ attempt 或强改状态。旧租约不能覆盖新结果,有限基础设施重
挂载、无业务凭据且整体上限已读回的独立测试 VM 内验收。开发 Compose 仍只提供可信
数据库和 broker,不在宿主或业务服务器运行用户代码。workflow 如需启用由指定
GitHub 私有仓库承载,并设置有限并发;Gitea 只保存逐阶段工程提交。
## 四语言节点的受控升级
新增公开示例 `judge.admission.example.json` 为显式 v1/v2 注册表,
`sandbox.managed.runtime.example.json` 为一槽位的共享 Root 配置;原 v1 示例保持原语义。
所有 `aaaaaaaa…` 镜像摘要均是无权限占位值,不能当作已验镜像。管理员制作固定镜像后,
对 manifest.json 的实际字节计算 SHA-256,逐文件验证版本/字节/权限,并将相同完整身份
写入准入注册表与 Root runtime_images。Root 镜像路径仅在私有可信配置中保存。
配置解析通过或 check-runtime 可见仍不允许跳过实际隔离门控。
1. 停止创建新提交/消费投递,向所有普通 Worker 发 SIGTERM;保留 DB、清单、工件和 journal。
2. 取得工厂实际 stopped/cleanup_complete 证明,读回空任务 cgroup 和 owned 资源;
未排空或存在未知资源时停止升级,保留证据,不递归清空任务目录。
3. 使用独立迁移账号执行 Backend Alembic upgrade;新语言数据存在时旧迁移降级会拒绝,
不删除数据以实现回退。平台与 Coordinator 继续使用各自最小权限角色,Worker 无 DB 账号。
4. 安装固定版本的 Backend/Coordinator/Worker/Sandbox;同时更新三个普通服务的同一
`judge_admission`/`admission` 注册表,Root 配置单独由管理员持有。旧消费者不混用新协议。
5. 为整体节点、控制面各服务、工厂和任务设置有限 CPU/memory/swap/pids/文件/期限,
读回内核值。节点至少预留一份512MiB编译任务以及独立控制面;Java运行示例总预算384MiB,
Xmx不能代替整体预算。并发1/prefetch1,共享UID池,不因第二Worker存在而扩大节点槽位。
6. 在独立无NIC、无宿主共享挂载、无业务凭据 VM 用合成题目验证四语言、故障与实际排空,
再恢复工厂/Coordinator/API/publisher/Worker。生产启用需单独安排,仓库不自动部署。
请求不在线安装 Python/Java 依赖,不运行 pip/uvx,不接收自定义解释器参数/JAR/agents。
Python main.py 仅标准库;Java Main.java 使用默认包 Main,最多256个有界编译class。
题目语言与预算以公开版本配置为准,旧题目和草稿保留,Rust继续明确不支持。
新版检查阶段CE/运行RE/真实限额与SystemError的区别见 [判题说明](../judge/README.md#python--java-与明确协议版本)。
停止/故障恢复沿原单机流程:停止Worker使任务全树排空,旧租约/report拒绝后恢复;
publisher/broker中断保留outbox,有限重试而非清空记录。恢复旧软件前应先排空v2任务,
保留不可变v2版本和报告供兼容消费者读取;不能把旧配置静默转换为宽松新能力。
这些公开配置不含业务令牌。数据库/AMQP/服务令牌分别在仓库外私下生成,Root不持有它们。
需要CI时只在GitHub私有仓库 `KiriAky107/KF-OnlineJudge` 运行并设置有限并发,Gitea保存源码。
+185
View File
@@ -0,0 +1,185 @@
{
"schema_version": 2,
"legacy": {
"max_concurrent_jobs": 1,
"prefetch": 1,
"max_retries": 2,
"max_job_wall_time_us": 60000000,
"max_package_bytes": 67108864,
"compile_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
},
"run_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 67108864,
"stack_bytes": 8388608,
"processes": 8,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
},
"toolchain": {
"toolchain_id": "gnu-cxx-v1",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"image_revision": 1
}
},
"multi_runtime": {
"max_concurrent_jobs": 1,
"prefetch": 1,
"max_retries": 2,
"max_job_wall_time_us": 60000000,
"max_package_bytes": 67108864,
"schema_version": 2,
"capabilities": [
{
"language": "c17",
"toolchain": {
"toolchain_id": "gnu-cxx-v1",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "gnu-cxx-v1"
},
"compile_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
},
"run_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 67108864,
"stack_bytes": 8388608,
"processes": 8,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
}
},
{
"language": "cpp20",
"toolchain": {
"toolchain_id": "gnu-cxx-v1",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "gnu-cxx-v1"
},
"compile_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
},
"run_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 67108864,
"stack_bytes": 8388608,
"processes": 8,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
}
},
{
"language": "python313",
"toolchain": {
"toolchain_id": "cpython313-v1",
"image_kind": "linux_cpython313_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "3.13.16"
},
"compile_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 67108864,
"stack_bytes": 8388608,
"processes": 8,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
},
"run_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 67108864,
"stack_bytes": 8388608,
"processes": 8,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
}
},
{
"language": "java21",
"toolchain": {
"toolchain_id": "openjdk21-v1",
"image_kind": "linux_openjdk21_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "21.0.12.1+1-LTS"
},
"compile_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
},
"run_ceiling": {
"cpu_time_us": 1000000,
"wall_time_us": 3000000,
"memory_bytes": 402653184,
"stack_bytes": 8388608,
"processes": 32,
"open_files": 64,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 16777216,
"workdir_bytes": 67108864
}
}
]
}
}
+111
View File
@@ -0,0 +1,111 @@
{
"schema_version": 1,
"state_root": "/var/lib/kf-judge",
"tasks_root": "/var/lib/kf-judge/tasks",
"image_root": "/var/lib/kf-judge/images/gnu-cxx-x86_64-v1",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"delegated_cgroup_root": "/sys/fs/cgroup/kf-judge.service",
"identities": {
"worker_uid": 1000,
"worker_gid": 1000,
"first_task_uid": 100000,
"first_task_gid": 100000,
"count": 1
},
"max_concurrent_runs": 1,
"per_task_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
},
"aggregate": {
"memory_bytes": 805306368,
"supervisor_memory_bytes": 268435456,
"processes": 64,
"supervisor_processes": 32,
"workdir_bytes": 402653184,
"supervisor_workdir_bytes": 67108864,
"cpu_period_us": 100000,
"cpu_quota_us": 150000,
"task_cpu_quota_us": 100000,
"supervisor_cpu_quota_us": 50000
},
"runtime_images": [
{
"image_root": "/var/lib/kf-judge/images/gnu-cxx-v2",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"runtime_identity": {
"toolchain_id": "gnu-cxx-v1",
"image_kind": "linux_gnu_cxx_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "gnu-cxx-v1"
},
"per_task_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
}
},
{
"image_root": "/var/lib/kf-judge/images/cpython313-v1",
"image_kind": "linux_cpython313_x86_64_v1",
"runtime_identity": {
"toolchain_id": "cpython313-v1",
"image_kind": "linux_cpython313_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "3.13.16"
},
"per_task_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
}
},
{
"image_root": "/var/lib/kf-judge/images/openjdk21-v1",
"image_kind": "linux_openjdk21_x86_64_v1",
"runtime_identity": {
"toolchain_id": "openjdk21-v1",
"image_kind": "linux_openjdk21_x86_64_v1",
"image_revision": 1,
"image_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"runtime_version": "21.0.12.1+1-LTS"
},
"per_task_ceiling": {
"cpu_time_us": 10000000,
"wall_time_us": 30000000,
"memory_bytes": 536870912,
"stack_bytes": 16777216,
"processes": 32,
"open_files": 128,
"stdout_bytes": 1048576,
"stderr_bytes": 1048576,
"file_bytes": 67108864,
"workdir_bytes": 268435456
}
}
]
}