Replies: 2 comments 1 reply
|
I verified the reported current-path behavior against rc.7 ( |
|
按 rc.8( 1. 根因精确确认 + 家族连接。 2. denial123789 的 4 个状态机问题中,"无子进程可在 grant 确认前启动"这一点值得再深化一个语义。 fail-closed 窗口期(grant 落地前工作区写被拒)不只是"命令失败"—— 3. 修复形态整体认可:子进程承载分钟级内核调用 + 事件循环保持响应 + 精确 ACE skip 保留 O(1) 二次路径,是这个包"原生资源语义外移"的正确方向。等你把修复整理成可审查的补丁(或 PR 通道重开)时,我可以帮忙过一遍状态机边界用例。 |
Uh oh!
There was an error while loading. Please reload this page.
Bug + fix: Windows 大工作区首次 workspace-write 授权同步遍历 ACL 整树,事件循环冻结数分钟
Summary
Windows 下,大工作区的首次
workspace-write命令会冻结整个服务器数分钟。冻结期间所有 RPC(session.create、终端 spawn、工具调用)全部超时——Web UI 表现为"AI 每次跑终端命令都卡死"。我定位到了根因,并准备好了带确定性回归测试的完整非阻塞修复。由于官方不接收外部 PR(per CONTRIBUTING.md),故发布在此提请团队关注。完整实现与测试在独立仓库:https://github.com/Ranecc/topolyte-windows-acl (Cordis 插件
@topolyte/windows-acl,基于官方@deepseek-ai/dsh-sandbox-windows-acl包,bundle-patch 挂载,无需 fork)。Root cause
首次
workspace-writeprovision 时,LocalSandboxProvider.materializeAclGrant在confine()(用户可见请求路径)上同步调用grant.add(workspaceRoot, true)(standing grant)。grantWrite → SetNamedSecurityInfoW带 OI|CI 继承标志,触发 Windows 的 eager 可继承 ACE 传播:内核同步递归整棵子树。大树上耗时数分钟,且运行在 harness 事件循环上,整个服务器(所有 session、HTTP、RPC)冻结。官方代码已承认此成本:
packages/sandbox/sandbox-windows-acl/src/acl.ts:"it would otherwise re-propagate the identical ACE across the whole tree (eager inheritance; minutes on large workspaces)"hasExactGrant精确匹配跳过)只让第二次 provision 变 O(1),第一次仍阻塞——第一次必然触发全树传播,无法绕过。Fix
把昂贵的 eager ACE 传播移出事件循环。核心三件事:
1. 首次
grantWrite(workspaceRoot, true)放进独立子进程(spawn而非spawnSync),成功后再记录 standing grant:2.
confine()保持同步但 fail-closed:kick off,绝不 await 整树遍历:standing ACE 落地前,受限子进程的工作区写被拒(
access is denied)——fail-closed,绝不冻结;一旦落地,exact-ACE skip 让之后每次 provision 变 O(1)。子进程用stdio: 'ignore'+ 监听exit,无僵尸进程;多进程前端由官方acl.ts的withPathLock(LockFileEx per-path 锁)兜底。3. 暴露
prewarm配置,部署可在启动时为已知工作区预热,缩短首条命令前的 fail-closed 窗口:Verification
端到端(icacls 断言):standing 工作区 ACE 带外物化(
SetNamedSecurityInfoW由子进程落地);temp ACE 在 teardown 撤销;工作区 ACE 跨 provider 保留。e2e 脚本:scripts/e2e-acl.ts。Benchmark(劫持官方
grant.ts/workspace-sid.ts源码实测,非推测):两个关键数据点:
hasExactGrant只读目录自身 DACL 头;而首次成本随整树放大,数万文件的 monorepo 上同步遍历超过两分钟。单测:
@topolyte/windows-acl仓库内 vitest 套件通过(含异步授权合并、temp 隔离、错误路径);插件继承官方SandboxProvider基类,不破坏官方契约。All reactions