Skip to content

fix: 修复长命令取消后沙盒清理阻塞及会话排队 - #1098

Open
Zh-XuH40 wants to merge 1 commit into
xerrors:mainfrom
Zh-XuH40:main
Open

Zh-XuH40 wants to merge 1 commit into
xerrors:mainfrom
Zh-XuH40:main

Conversation

@Zh-XuH40

Copy link
Copy Markdown

变更说明

执行长时间 shell 命令时点击停止,Agent 的异步等待被取消,但默认 aexecute() 在线程中运行的同步 GEM 请求仍可持续到原始超时。runtime 删除等待代理请求排空,同一会话的新消息继续排队;前端轮询只看到 Run 已终态,会提前显示结束。

  • 任务类型:bug-fix。
  • 目标:将取消传递到对应 GEM session;限制 provisioner 的操作锁等待;让 API 和 Web 按 runtime 清理状态投影当前运行。
  • 非目标:不改变 FIFO、数据库/队列 Owner、模型行为、权限或部署拓扑;不回滚取消前已经完成的文件和外部副作用。
  • substantial 判断:影响命令执行、取消、runtime 清理与跨层终态行为,补充决策记录和事故复盘。

主要改动:异步创建独立 shell session、启动命令并以短请求等待;取消先收敛启动再显式 kill,并处理重复取消。provisioner 锁等待最多 5 秒,忙碌返回可重试 503;等待 pin 时取消也归还晚取得的 pin。健康检查独立于同步线程池。当前运行接口和 Web 看门狗/断线/刷新恢复保留尚未清理的终态 Run。清理日志补齐 Run 身份和 traceback。

工程主张与 Owner

  • 命令执行和终止由 ProvisionerSandboxBackend.aexecute() 与 _terminate_command() 拥有;硬超时缺少退出码时报告失败码 124。
  • 请求排空、删除互斥和 503 由 provisioner 的 SandboxOperationPins 拥有;失败的并发删除不能释放其他删除者的栅栏。
  • PostgreSQL 的 runtime_cleanup_pending 继续拥有持久清理意图。终态事务可先于 runtime 删除;只有清理成功后才解除同一会话 FIFO fence、发布 end。
  • 当前运行 API 和 useAgentRunStream 消费这项数据库事实;HTTP、数据库、generation、PID/文件和 Redis 事件是观察边界。
  • 决策记录:沙盒命令取消与有界清理。

验证情况

取消传递与结果投影

  • 失败面:只取消 Python 等待,远端命令继续执行;启动与 kill 乱序;重复取消打断终止;超时被当成未知退出码。
  • 语义 Owner:Sandbox backend、当前运行 service、Web Run stream。
  • 直接证据 / 命令:在上游补丁快照运行 python -m pytest test/unit/backends/test_sandbox_command_cancellation.py test/unit/backends/test_sandbox_provisioner_config.py test/unit/services/test_agent_run_service.py test/unit/services/test_run_worker.py -q,198 项通过;node --test test/unit/agentRequestQueue.test.js,36 项通过。
  • 负向案例:启动确认前后取消与第二次取消;cleanup pending 下看门狗和断线不得结束;新标签页恢复三种待清理终态。原实现对应取消与提前结束用例失败。
  • 结果:Passed。

繁忙删除有界,其他 runtime 和健康检查可用

  • 失败面:长代理 pin 使删除永久等待;同步池饱和使健康检查无法响应。
  • 语义 Owner:provisioner 操作 pin、异步健康路由。
  • 直接证据 / 命令:python -m pytest test/integration/services/test_sandbox_cancel_lifecycle.py -k busy_proxy -q 和 -k health_responds -q 各 1 项通过。使用真实 GEM/HTTP:繁忙删除返回 503 后,其他沙盒继续执行;同步线程池全部占用时健康检查仍响应。
  • 负向案例:活跃 pin 阻止删除且不能误报成功;第二个删除者超时不能释放第一个栅栏;已取消代理的晚到 pin 必须归还。
  • 结果:Passed。

完整取消与 FIFO 清理链路

  • 失败面:数据库已经取消,进程和清理仍残留;清理前放行同一线程;清理后未发布终态。
  • 语义 Owner:worker、PostgreSQL Run/Attempt、GEM/provisioner、Redis 事件。
  • 直接证据 / 命令:新增 test_http_stop_kills_gem_before_worker_releases_fifo,在 PostgreSQL 隔离 Schema 中验证实际 PID、文件、清理标记、lease、generation 和 end 事件。当前上游 PostgreSQL 环境未提供,暂未运行该用例。
  • 负向案例:清理前 active Run 必须存在且没有 end;清理后实例消失、lease 清空、end 可读,后续命令成功。
  • 结果:Not run。当前补丁快照尚未完成 PostgreSQL 与实际 API/ARQ/SSE 的完整运行链路验证。

通用检查

  • 失败面:静态契约、格式、构建或回归不一致。
  • 语义 Owner:工程契约脚本、Ruff、Web lint/build 与 docs build。
  • 直接证据 / 命令:上游补丁快照 python -m pytest test/unit -m "not slow" -q,2520 项通过;python scripts/verify_engineering_contracts.py,检查 184 份文档;python -m unittest scripts.test_verify_engineering_contracts,63 项通过;改动文件 Ruff check、Web ESLint、Vite build、VitePress build 与独立索引 git diff --check 通过。
  • 负向案例:沿用工程契约、源码/格式检查与正式链接构建的拒绝后果。
  • 结果:Passed。后端全量结果见补充说明;前端全量存在可在无补丁上游基线重现的失败,不能写为全绿。

简化 / 删除验收

不涉及。

独立语义 Review

Not run:尚无全新上下文 Reviewer 的独立结论。此 PR 拟以 Draft 提交,等待独立语义审查和完整运行链路验证;测试结果不能代替独立代码 Review。

未验证范围与风险

  • Not run:上游 PostgreSQL 取消集成用例、实际 API/ARQ/SSE deterministic E2E、Kubernetes 和真实外部模型探针。
  • 前端全量回归未全绿:至少 5 项失败已在未打补丁的官方 main 复现,位于 agentRuntimeConfigVisibility.test.js、chatStartScreen.test.js 和 modelProviderSaveActions.test.js。这些文件与其业务实现不在本 PR 修改范围。
  • GEM 终止请求可能失败;异常会记录,runtime 清理仍受 generation 和 durable cleanup fence 约束。每条异步命令增加 session 创建、短轮询与最终输出读取请求。

事故反馈

长命令取消后 runtime 清理阻塞。记录已确认的长调用残留和清理阻塞,并区分没有现场线程栈支持的线程池耗尽推断;包含 reproducer、直接 oracle、负向案例和未验证范围。

界面变更

调整运行状态与恢复行为,无布局或视觉样式变化。截图/录屏为 Not run。

关联事项

无。已搜索上游相关 sandbox/cancel PR。

补充说明

补丁基于官方 main 的 031e2c72681edb8f95f71b60ceb66881f7915b8d,范围为沙盒命令取消、runtime 清理、运行状态投影及对应测试和文档。保持该基线的 PostgreSQL 与 SDK 依赖,无 schema、迁移或新增产品依赖。

后端全量初次运行 2517 项通过,3 项因复用运行环境缺少上游声明的 xlrd 而失败;将锁定版本 xlrd==2.0.2 安装到独立临时测试目录后,全量复验 2520 项通过。测试目录通过 PYTHONPATH 装配,没有修改正在运行的应用依赖。

@Zh-XuH40
Zh-XuH40 marked this pull request as ready for review October 10, 2026 08:27

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant