系统架构
ash 是一个独立 Rust workspace 和发行单元。A3S 主仓库只通过 crates/ash Git
子模块固定经过验证的提交,不把它并入根 Cargo 包。
数据流
为什么使用 Rust
- 单个原生二进制覆盖六个操作系统/架构目标。
- 所有权与类型系统适合表达请求生命周期、取消、事务和一次性 Permit。
- Tokio 处理大量 I/O 等待,Rayon 将可拆分 CPU 工作映射到固定多核池。
Send + Sync公共边界让长驻 Harness 可以安全共享只读状态与调度器。
双执行平面
Tokio I/O
负责标准输入/输出 RPC、子进程、管道、超时、取消、更新下载和有界文件 I/O。外部程序 默认通过 executable + argv 直接启动,不隐式进入 Bash、PowerShell 或 CMD。
取消不是只发一个信号。Unix 会终止并等待所属进程组,Windows 会终止并等待 Job Object
清空;随后 exec 还会等待 stdin、stdout 和 stderr 任务结束,才编码最终取消响应。
stdout 与 stderr 始终以 16 KiB 块并发排空。单路在 4 MiB 内保留于内存;超过后,完整 字节流转入会话私有临时文件,内存只留下有界的首尾样本用于即时投影。完整前缀与后续 块会在写盘前计入会话额度,需要引用的两路输出一起提交,因此失败不会发布半截 Alias。 完整内容的 BLAKE3 哈希由 Rayon 通过 4 MiB 固定缓冲计算,不占用 Tokio I/O Worker。
磁盘引用支持按字节范围读取;必须读取完整值的消费者仍受 8、64 或 128 MiB 独立上限 约束。租约阻止使用中的文件被提前删除;释放引用或结束会话后,最后一个租约结束时会 清理临时文件。
崩溃残留不依赖常驻守护进程。后续进程首次创建结果存储时,只会回收标记已满一小时、 能取得独占锁,且目录内全是已知普通文件的 ash spool。活动、刚创建、标记异常、包含 符号链接或外来文件的目录一律保留;删除逐文件执行,不做递归删除。
Rayon CPU
负责搜索准备、哈希、Diff、归约和其他可拆分计算。固定工作窃取池使用主机可用核心, 但不会为每个请求创建新线程池。
进程管道排空完成后,UTF-8 投影也进入这个固定池:连续重复行折叠为 ×N,重复 K 行块
折叠为 ×N#K;非成功原生退出随后保留固定诊断窗口,只把节省字节的间隔替换为 ⋯N,最后
执行输出预算。分类、候选与验证可以并行,结果仍按稳定源顺序归并。超时或取消的最终清理
使用同一有界池,不会被已经取消的请求 Permit 拦掉终止证据。
分层 Governor
主机、会话、请求和动作共享预算。宽批图不能把每个节点的内部并行再次相乘;预算覆盖 并发度、截止时间、读取字节、输出记录与保留证据。
确定性边界
Worker 可以按任意顺序完成,但响应先按协议定义的稳定键归并,再投影、截断和编码。 相同输入、能力和文件状态必须产生逐字节一致的规范 ASON。
完整组件所有权与失败边界见 仓库架构设计。