feat: 跨 worker 真 kill(kill_requests 意图表 + 收殓器)与自动化触发入闸
机制 A 移植自旧 PR #101(分支 feat-residual-b,头 895e004),
不合旧 PR:旧基线 6e3eb7b 已 CONFLICTING,本批重做到现 main
6d4f87e(#151 合并后)上。
- kill_requests 意图表:cloud/db.py POSTGRES_SCHEMA + migrations
清单补表;server.ensure_kill_requests_table / request_kill
(同一任务只留一条 pending,写失败返回 False);init_db 的
SQLite 分支补建表(PG 分支由 POSTGRES_SCHEMA 全量建表覆盖)。
- 取消/sweep 写请求 best-effort:_cancel_task 在 commit 后调
request_kill(失败不挡取消);sweep_stale_tasks 在同一事务
内为被扫任务写 system 请求。
- worker 收殓器 _reap_kill_requests:owner 活着(心跳停滞未超
300 秒,COALESCE(last_heartbeat, updated_at))绝不抢杀;只
有 owner 已死且任务仍 interrupted 时,按任务派生容器名
(executor.container_name,codex-<安全字符任务 id>)在本机
真杀,绝不按前缀扫、绝不杀自由传入的名字;本机无容器时
请求照常终结;任务行失踪或已不在 interrupted 时请求直接
终结;单条异常只记日志。run loop 每轮调一次,放在 sweep
块外(旧 PR 只在 sweep 块内,sweep 关掉时请求会积压)。
- 自动化入闸只补两条旁路:worker._coord_sync_children 建子任
务前过 _quota_exceeded(超限跳过建任务、记审计,同一 worker
内同一分工只记一次);automations.run_due_automation
(claim 抢单 -> 配额门 -> 建任务 -> 记产出,超限记
skipped_quota 不进失败重试)。triage/webhook/续跑/后续/
分叉未动。
- 单测:旧 PR 三份单测原样移植(Worker/Server 签名与现 main
兼容,未改用例语义)。
This commit is contained in:
1 parent
b306b56517
commit
3a06205d8b
8 files changed
+938
-12
No files matched your search
+13
@@ -1030,6 +1030,19 @@ POSTGRES_SCHEMA = (
|
||||
"memory_id TEXT, "
|
||||
"created_at DOUBLE PRECISION, "
|
||||
"processed_at DOUBLE PRECISION)",
|
||||
# kill_requests:跨 worker 真 kill 的意图表。取消/sweep 只改库
|
||||
# 状态杀不掉 owner 已死时遗留的容器;写一条 pending 请求后,
|
||||
# 任何活着的 worker 在 run loop 的收殓器里按任务派生容器名
|
||||
# 在本机 docker 杀掉并标 done。同一任务只留一条 pending
|
||||
# (request_kill 的 SELECT 守卫,见 server.py;并发重复写
|
||||
# 撞上时多出的行同样幂等终结,不会多杀——杀本身按名幂等)。
|
||||
"CREATE TABLE IF NOT EXISTS kill_requests("
|
||||
"id TEXT PRIMARY KEY, "
|
||||
"task_id TEXT, "
|
||||
"requested_by TEXT, "
|
||||
"status TEXT, "
|
||||
"requested_at DOUBLE PRECISION, "
|
||||
"done_at DOUBLE PRECISION)",
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user