长任务 P0 三件:断点进库、错误分类+熔断、Run/Step 时间线
断点进库:task_checkpoints 表(PG 新库 + 老库幂等补表 + 迁移清单
对齐);worker 在 goal 任务执行期间每 30 秒把磁盘 host-state 断点
镜像进库,终局再补一次;断点续跑认领前,若 host-state 条目丢失
但库里有断点,先按库断点重建最小条目再跑,库里也没有断点时不
造假、走原有拒绝路径。
错误分类+熔断:sandbox 四处解析加永久错误分支(KeyError、配置
缺失等无结论异常退出判 failed 死信,不再判 interrupted;host 已
明言 interrupted 的不受影响,未知错误不分类);worker 自动恢复
加退避(10 秒起指数退避、封顶 300 秒)与无进展熔断(库断点轮次
连续 3 次不变即标 auto_resume_stalled 等人工)。
时间线:task_steps 表 + host 每轮写 host-steps 步骤文件 + worker
导入;GET /tasks/{id}/timeline 一次返回 steps 与 checkpoints;
认领、暂停、自动恢复、终局都记步骤。旧任务返回空数组,不编造。
单测:cloud/tests/test_p0_three.py 14 项(分类、熔断、镜像重建、
步骤导入去重、timeline 接口)。
This commit is contained in:
1 parent
d56bd3a99e
commit
585242fc8f
7 files changed
+982
-3
No files matched your search
+26
@@ -805,6 +805,32 @@ POSTGRES_SCHEMA = (
|
||||
"action TEXT, "
|
||||
"detail TEXT, "
|
||||
"created_at DOUBLE PRECISION)",
|
||||
# P0 三件:断点与步骤事实源(PG 新库一次建齐;老库走
|
||||
# server/worker 的 ensure 幂等补表,不丢数据)。
|
||||
# task_checkpoints:每轮断点快照(worker 镜像线程 + 终局
|
||||
# 导入写),(task_id, round_no) 唯一;断点丢失时可据此
|
||||
# 重建 host-state 续跑,不再只信容器里的 host-state.json。
|
||||
"CREATE TABLE IF NOT EXISTS task_checkpoints("
|
||||
"task_id TEXT, "
|
||||
"round_no INTEGER, "
|
||||
"thread_id TEXT, "
|
||||
"goal_status TEXT, "
|
||||
"state_sha TEXT, "
|
||||
"verify_out TEXT, "
|
||||
"created_at DOUBLE PRECISION, "
|
||||
"PRIMARY KEY(task_id, round_no))",
|
||||
# task_steps:Run/Step 时间线(worker 侧 claim/resume/final
|
||||
# + host 每轮 round + 镜像导入),timeline 接口直读此表。
|
||||
"CREATE TABLE IF NOT EXISTS task_steps("
|
||||
"id TEXT PRIMARY KEY, "
|
||||
"task_id TEXT, "
|
||||
"step_no INTEGER, "
|
||||
"kind TEXT, "
|
||||
"summary TEXT, "
|
||||
"state_sha TEXT, "
|
||||
"created_at DOUBLE PRECISION)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_task_steps_task"
|
||||
" ON task_steps(task_id, step_no)",
|
||||
"CREATE TABLE IF NOT EXISTS projects("
|
||||
"id TEXT PRIMARY KEY, "
|
||||
"name TEXT, "
|
||||
|
||||
Reference in new issue
Block a user